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,有时我觉得这很奇怪.
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- 取决于平台/控制台 - 可能有也可能没有可视化表示.
迟到了,但我希望这能有所帮助。
简单来说
0的1方式8 bits表示UTF-8编码,即字符dynamic包含字节的大小数组,即每个元素都是 UTF-8 字符。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因此当您更新字节片时,您不会在内存中重新创建新的内容。
因此,选择正确的结构可能会对您的应用程序性能产生影响。
| 归档时间: |
|
| 查看次数: |
1001 次 |
| 最近记录: |