无论如何在Go中创建空终止字符串?

时间:2016-06-24 06:57:35

标签: string go c-strings

无论如何在Go中创建null终止的string

我目前正在尝试的是a:="golang\0",但它显示编译错误:

non-octal character in escape sequence: "

3 个答案:

答案 0 :(得分:27)

Spec: String literals:

  

引号之间的文本形成文字的值,反斜杠转义符在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"
}