为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
交互式爱情 2021-11-08 15:57:02
s := "some string"b := []byte(s) // convert string -> []bytes2 := string(b) // convert []byte -> stringGo 中的string和 有什么区别[]byte?什么时候用“他”或“她”?为什么?bb := []byte{'h','e','l','l','o',127}ss := string(bb)fmt.Println(ss)你好输出只是"hello",缺少127,有时我觉得很奇怪。
查看完整描述

2 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

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

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

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

博客:数组、切片(和字符串):“追加”的机制

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

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

什么时候使用一个?

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

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

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

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

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

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


这个例子:

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

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


查看完整回答
反对 回复 2021-11-08
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

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

简单来说

  • 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因此当您更新字节切片时,您不会在内存中重新创建新内容。


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


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 469 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信