如何在Go

时间:2019-04-16 16:35:03

标签: go

想要在Go中使用一个空的char / byte,大小/长度为零,例如byte("")


func main() {
    var a byte = '' // not working
    var a byte = 0  // not working
}

一个更具体的例子是


func removeOuterParentheses(S string) string {
    var stack []int
    var res []byte
    for i, b := range []byte(S) {
        if b == '(' {
            stack = append(stack, i)
        } else {
            if len(stack) == 1 {
                res[stack[0]] = '' // set this byte to be empty
                res[i] = '' // / set this byte to be empty
            }
            stack = stack[:len(stack)-1]
        }
    }
    return string(res)
}

an equivalent question in Java

1 个答案:

答案 0 :(得分:0)

byteuint8类型的别名。拥有一个“空字节”实际上没有任何意义,就像拥有一个“空数字”没有任何意义(您可以拥有数字0,但是什么是“空”数字?)

您可以分配零值(b := byte(0)var b byte),该值可以用来表示尚未分配任何值(“零值”)。 0的字节值称为“空字节”。通常它通常不会出现在常规文本中,而经常出现在二进制数据中(例如图像,压缩文件等)

这不同于byte(""),后者是字节的序列。您可以具有一个零字节序列。打个比方:我可以有一个没有钱的钱包,但是我没有一个值得“空”的硬币。


如果您真的想区分“ 0值”和“从不设置”,则可以使用指针或结构。带有指针的示例:

var b *byte
fmt.Println(b)      // <nil>, since it's a pointer which has no address to point to.

one := byte(0)
b = &one            // Set address to one.
fmt.Println(b, *b)  // 0xc000014178 0 (first value will be different, as it's
                    // a memory address).

您需要在这里稍加注意,因为*b如果您尚未分配值,将很恐慌。根据使用方式,它可以很好地工作,或者非常尴尬。在标准库中使用的示例是flag package

另一种可能性是对字节本身使用带有单独字段的结构,并使用一个标志记录该字节是否已设置。在database/sql库中,已经有Null*种类型(例如NullInt64),您可以将其用作起点。

相关问题