
go 中无法直接用 '\0' 设置 byte 切片的空字符,需改用 '\x00'、'\000' 或整数字面量 0,因为 go 的 rune 字面量不支持单数字八进制 \0 语法。
go 中无法直接用 '\0' 设置 byte 切片的空字符,需改用 '\x00'、'\000' 或整数字面量 0,因为 go 的 rune 字面量不支持单数字八进制 \0 语法。
在 Go 语言中,字符串底层不可变,因此常通过 []byte 进行可变操作。但初学者容易误将 Java 的 '\0' 写法直接迁移到 Go —— 实际上,'\0' 在 Go 中是非法的 rune 字面量,编译器会报错:invalid character literal (more than one character) 或 invalid octal escape。
✅ 正确写法有以下三种(等价且推荐):
str := []byte("Mr John Smith ")
str[12] = '\x00' // 十六进制转义(推荐,语义清晰)
// 或
str[12] = '\000' // 八进制转义(必须三位,'\000' 合法,'\0' 不合法)
// 或
str[12] = 0 // 最简洁:直接赋值字节零值(类型安全,无需引号)
⚠️ 注意事项:
- Go 的
byte是uint8的别名,因此str[12] = 0是最自然、最符合 Go 风格的写法; -
'\x00'和'\000'属于 rune 字面量,仅在上下文明确为byte(即uint8)时才被隐式转换,而直接写0更直观、无歧义; - C/Java 风格的
'\0'在 Go 中不存在——Go 规范要求八进制转义必须为三位(如\000),十六进制必须以\x开头且后跟两位十六进制数; - 此操作仅修改字节切片内容,不会自动截断字符串;若需生成以
\x00结尾的有效 C 字符串(如调用 CGO),请确保后续逻辑正确处理终止符位置。
? 小结:与其记忆转义规则,不如优先使用 str[i] = 0 —— 简洁、安全、符合 Go 的显式与直白哲学。











