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

时间:2015-09-17 08:39:57

标签: string go slice

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,有时我觉得它很奇怪。

2 个答案:

答案 0 :(得分:6)

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()),您应该考虑将其存储为{{1}首先。

另请注意,您可以[]byte constants,但没有切片常量。这可能是一个小优化。另请注意:

  

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

此外,如果您使用的是已编写的代码(标准库,第三方软件包或您自己的代码),在大多数情况下,会给出您必须传递或返回的参数和值。例如。如果您从io.Reader读取数据,则需要使用s来接收读取的字节,但不能使用[]byte。< / p>

这个例子:

string

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

答案 1 :(得分:2)

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

简单来说

  • 01 是机器表示所有信息的方式
  • Byte8 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 因此当您更新字节切片时,您不会在内存中重新创建新内容。

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

相关问题