【问题标题】:What is the difference between the string and []byte in Go?Go中的字符串和[]字节有什么区别?
【发布时间】:2015-12-14 01:33:19
【问题描述】:
s := "some string"
b := []byte(s) // convert string -> []byte
s2 := string(b) // convert []byte -> string

Go 中的 string[]byte 有什么区别?

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

为什么?

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

你好

输出只有"hello",缺少127,有时候觉得很奇怪。

【问题讨论】:

  • 字符值127 (ASCII DEL) 是字符串的部分。但是,它不会呈现为字符(此处)。查看字符串的长度(它将为 6)以验证是否包含此字符 ,即使未显示。 (许多其他字符代码,例如低于 32 的字符代码,也不会在标准控制台中呈现为字符。)

标签: string go slice


【解决方案1】:

晚了,但我希望这会有所帮助。

简单来说

  • 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]

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

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

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


重要提示:

作为strings are immutable,它们不能在内存中更改,每次您从字符串中添加或删除某些内容时,GO 都会在内存中创建一个新字符串。另一方面,byte slices are mutable 所以当你更新一个字节片时,你并没有在内存中重新创建新的东西。

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

【讨论】:

  • 这个答案对于普通人来说更容易理解。
【解决方案2】:

string[]byte是不同的类型,但是they can be converted to one another

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

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

博客:Arrays, slices (and strings): The mechanics of 'append'

字符串实际上非常简单:它们只是字节的只读切片,并带有一些来自语言的额外语法支持。

另请阅读:Strings, bytes, runes and characters in Go

什么时候使用一个而不是另一个?

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

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

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

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

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

此外,如果您使用的是已经编写好的代码(标准库、第三方包或您自己的),在大多数情况下,它会给出您必须传递或返回的参数和值。例如。如果您从io.Reader 读取数据,则需要有一个[]byte,您必须将其传递以接收读取的字节,您不能为此使用string


这个例子:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2011-11-13
    • 2011-12-06
    相关资源
    最近更新 更多