无论如何在Go中创建null终止的string
我目前正在尝试的是a:="golang\0"
,但它显示编译错误:
non-octal character in escape sequence: "
答案 0 :(得分:27)
引号之间的文本形成文字的值,反斜杠转义符在rune literals中解释(
\'
非法且\"
合法除外),同样的限制。三位八进制(\nnn
)和两位十六进制(\xnn
)转义表示结果字符串的各个字节;所有其他转义表示单个字符的(可能是多字节)UTF-8编码。
所以\0
是非法序列,你必须使用3个八进制数字:
s := "golang\000"
或使用十六进制代码(2个十六进制数字):
s := "golang\x00"
或unicode序列(4个十六进制数字):
s := "golang\u0000"
示例:
s := "golang\000"
fmt.Println([]byte(s))
s = "golang\x00"
fmt.Println([]byte(s))
s = "golang\u0000"
fmt.Println([]byte(s))
输出:所有以0码字节结束(在Go Playground上尝试)。
[103 111 108 97 110 103 0]
[103 111 108 97 110 103 0]
[103 111 108 97 110 103 0]
答案 1 :(得分:1)
@icza 描述了如何使用空终止符编写字符串文字。使用此代码将空值添加到字符串变量的末尾:
s += string(rune(0))
示例:
s := "hello"
s += string(rune(0))
fmt.Printf("%q\n", s) // prints "hello\x00"
答案 2 :(得分:0)
另一个选项是 ByteSliceFromString
函数:
package main
import (
"fmt"
"golang.org/x/sys/windows"
)
func main() {
b, e := windows.ByteSliceFromString("golang")
if e != nil {
panic(e)
}
fmt.Printf("%q\n", string(b)) // "golang\x00"
}