一尘不染

Go中的字符串和[] byte有什么区别?

go

s := "some string"
b := []byte(s) // convert string -> []byte
s2 := string(b) // convert []byte -> string

string[]byteGo 之间有什么区别?

什么时候使用“他”或“她”?

为什么?

bb := []byte{'h','e','l','l','o',127}
ss := string(bb)
fmt.Println(ss)

你好

输出是"hello",而缺少127,有时我觉得很奇怪。


阅读 160

收藏
2020-07-02

共1个答案

一尘不染

string并且[]byte是不同的类型,但是它们可以相互转换

3。将一个字节的切片转换为字符串类型会产生一个字符串,其连续字节是该切片的元素。

4。将字符串类型的值转换为字节片的类型会产生一个片,其连续元素是字符串的字节。

博客:数组,切片(和字符串):’append’的机制

字符串实际上非常简单:它们只是字节的只读切片,而该语言还提供了一些额外的语法支持。

另请阅读:Go中的字符串,字节,符文和字符

什么时候使用另一个?

取决于您的需要。字符串是不可变的,因此它们可以共享,并且您可以确保它们不会被修改。

字节片可以修改(表示后备数组的内容)。

另外,如果您需要经常将a转换string为a
[]byte(例如,因为需要将其写入io.Writer()),则应首先考虑将其存储为a
[]byte

另请注意,您可以具有string
常量,但没有切片常量。这可能是一个小的优化。另请注意:

len(s)如果s为字符串常量,则表达式为常量。

同样,如果您使用的是已经编写的代码(标准库,第三者软件包或您自己的代码),则在大多数情况下,系统会提供必须传递或返回的参数和值。例如,如果您从读取数据io.Reader,则必须[]byte具有必须通过的数据才能接收读取的字节,因此不能使用string


这个例子:

bb := []byte{'h','e','l','l','o',127}

这里发生的是,您使用了一个复合文字(切片文字)来创建和初始化一个新的类型切片[]byte(使用Short变量声明)。您指定了常量以列出切片的初始元素。您还使用了一个字节值127-取决于平台/控制台-
可能具有也可能没有视觉表示。

2020-07-02