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

Jas*_*hou 5 string go slice

s := "some string"
b := []byte(s) // convert string -> []byte
s2 := string(b) // convert []byte -> string
Run Code Online (Sandbox Code Playgroud)

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

何时使用"他"或"她"?

为什么?

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

你好

输出只是"hello",缺乏127,有时我觉得这很奇怪.

icz*_*cza 7

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

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

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

博客:数组,切片(和字符串):'追加'的机制:

字符串实际上非常简单:它们只是只读字节片段,并且语言提供了一些额外的语法支持.

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

何时使用一个而不是另一个?

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

可以修改字节切片(意味着支持阵列的内容).

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

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

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

此外,如果您使用的是已编写的代码(标准库,第三方软件包或您自己的代码),在大多数情况下,您将获得必须传递或返回的参数和值.例如,如果你从a读取数据io.Reader,你需要有一个[]byte你必须传递来接收读取字节的数据,你不能使用a string来实现.


这个例子:

bb := []byte{'h','e','l','l','o',127}
Run Code Online (Sandbox Code Playgroud)

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


Jua*_*ali 6

迟到了,但我希望这能有所帮助。

简单来说

  • :机器表示所有信息01方式
  • 字节8 bits表示UTF-8编码,即字符
  • [ ]type:给定数据类型的切片。切片是动态大小的数组。
  • [ ]byte:这是一个字节切片,即dynamic包含字节的大小数组,即每个元素都是 UTF-8 字符。
  • String:只读字节片,即immutable

考虑到这一切:

s := "Go"
bs := []byte(s)
fmt.Printf("%s", bs)     // Output: Go
fmt.Printf("%d", bs)     // Output: [71 111]
Run Code Online (Sandbox Code Playgroud)

或者

bs := []byte{71, 111}
fmt.Printf("%s", bs)     // Output: Go
Run Code Online (Sandbox Code Playgroud)

%s将字节切片转换为字符串

%d获取字节的 UTF-8 十进制值


重要的:

由于strings are immutable它们不能在内存中更改,每次在字符串中添加或删除某些内容时,GO 都会在内存中创建一个新字符串。另一方面,byte slices are mutable因此当您更新字节片时,您不会在内存中重新创建新的内容。

因此,选择正确的结构可能会对您的应用程序性能产生影响。

  • 这个答案对于普通人来说更容易理解。 (2认同)