想要在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)
}
答案 0 :(得分:0)
byte
是uint8
类型的别名。拥有一个“空字节”实际上没有任何意义,就像拥有一个“空数字”没有任何意义(您可以拥有数字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
),您可以将其用作起点。