s := "some string" b := []byte(s) // convert string -> []byte s2 := string(b) // convert []byte -> string
string和[]byteGo 之间有什么区别?
string
[]byte
什么时候使用“他”或“她”?
为什么?
bb := []byte{'h','e','l','l','o',127} ss := string(bb) fmt.Println(ss)
你好
输出是"hello",而缺少127,有时我觉得很奇怪。
"hello"
127
string并且[]byte是不同的类型,但是它们可以相互转换:
3。将一个字节的切片转换为字符串类型会产生一个字符串,其连续字节是该切片的元素。 4。将字符串类型的值转换为字节片的类型会产生一个片,其连续元素是字符串的字节。
3。将一个字节的切片转换为字符串类型会产生一个字符串,其连续字节是该切片的元素。
4。将字符串类型的值转换为字节片的类型会产生一个片,其连续元素是字符串的字节。
博客:数组,切片(和字符串):’append’的机制:
字符串实际上非常简单:它们只是字节的只读切片,而该语言还提供了一些额外的语法支持。
另请阅读:Go中的字符串,字节,符文和字符
什么时候使用另一个?
取决于您的需要。字符串是不可变的,因此它们可以共享,并且您可以确保它们不会被修改。
字节片可以修改(表示后备数组的内容)。
另外,如果您需要经常将a转换string为a []byte(例如,因为需要将其写入io.Writer()),则应首先考虑将其存储为a []byte。
io.Writer()
另请注意,您可以具有string 常量,但没有切片常量。这可能是一个小的优化。另请注意:
len(s)如果s为字符串常量,则表达式为常量。
len(s)
s
同样,如果您使用的是已经编写的代码(标准库,第三者软件包或您自己的代码),则在大多数情况下,系统会提供必须传递或返回的参数和值。例如,如果您从读取数据io.Reader,则必须[]byte具有必须通过的数据才能接收读取的字节,因此不能使用string。
io.Reader
这个例子:
bb := []byte{'h','e','l','l','o',127}
这里发生的是,您使用了一个复合文字(切片文字)来创建和初始化一个新的类型切片[]byte(使用Short变量声明)。您指定了常量以列出切片的初始元素。您还使用了一个字节值127-取决于平台/控制台- 可能具有也可能没有视觉表示。