String Go中的字符串和[]字节之间有什么区别?
Go中的String Go中的字符串和[]字节之间有什么区别?,string,go,slice,String,Go,Slice,Go中的字符串和[]字节之间有什么区别 什么时候用“他”或“她” 为什么? 你好 输出只是“hello”,缺少127,有时我觉得很奇怪。和类型不同,但是: 三,。将字节片转换为字符串类型将生成一个字符串,其连续字节是该片的元素 四,。将字符串类型的值转换为字节类型的切片将生成一个切片,其后续元素是字符串的字节 博客:: 字符串实际上非常简单:它们只是字节的只读片段,并有一点来自语言的额外语法支持 另见: 什么时候使用一个而不是另一个? 这取决于你需要什么。字符串是不可变的,所以它们可以共享,并且
字符串
和[]字节
之间有什么区别
什么时候用“他”或“她”
为什么?
你好
输出只是“hello”,缺少127
,有时我觉得很奇怪。和类型不同,但是:
三,。将字节片转换为字符串类型将生成一个字符串,其连续字节是该片的元素
四,。将字符串类型的值转换为字节类型的切片将生成一个切片,其后续元素是字符串的字节
博客::
字符串实际上非常简单:它们只是字节的只读片段,并有一点来自语言的额外语法支持
另见:
什么时候使用一个而不是另一个?
这取决于你需要什么。字符串是不可变的,所以它们可以共享,并且您可以保证它们不会被修改
可以修改字节片(表示支持数组的内容)
如果您需要频繁地将<代码>字符串 >转换为<代码> []字节(例如,因为您需要将其写入AN),首先应考虑将其存储为<代码> []字节。 还请注意,您可以有
字符串
,但没有切片常量。这可能是一个小优化。还请注意:
如果s
是字符串常量,则表达式len(s)
是常量
此外,如果您使用的是已经编写的代码(标准库、第三方软件包或您自己的),在大多数情况下,都会给出您必须传递或返回的参数和值。例如,如果您从中读取数据,则需要有一个[]字节
,您必须传递该字节才能接收读取的字节,而不能使用字符串
这个例子:
bb := []byte{'h','e','l','l','o',127}
ss := string(bb)
fmt.Println(ss)
这里发生的事情是,您使用了(slice literal)来创建和初始化类型为
[]byte
(使用)的新片。您指定了常量以列出切片的初始元素。您还使用了一个字节值127
,根据平台/控制台的不同,该值可能有视觉表示,也可能没有视觉表示。很晚了,但我希望这能有所帮助
简单地说
- 位:
和0
是机器表示所有信息的方式1
- 字节:
,表示UTF-8编码,即字符8位
- []类型:给定数据类型的切片。切片是动态大小数组
- []字节:这是一个字节片,即包含字节的
大小数组,即每个元素是一个UTF-8字符动态
- 字符串:只读字节片,即
不可变
考虑到所有这些:
s:=“开始”
bs:=[]字节
fmt.Printf(“%s”,bs)//输出:Go
fmt.Printf(“%d”,bs)//输出:[71 111]
或
bs:=[]字节{71111}
fmt.Printf(“%s”,bs)//输出:Go
%s
将字节片转换为字符串
%d
获取字节的UTF-8十进制值
重要提示: 由于
字符串是不可变的
,因此它们不能在内存中更改,每次从字符串中添加或删除内容时,GO都会在内存中创建一个新字符串。另一方面,字节片是可变的
,因此当您更新字节片时,您不会在内存中重新创建新内容
因此,选择正确的结构可能会影响应用程序的性能。字符值是字符串的一部分。但是,它不会渲染为角色(此处)。查看字符串的长度(将为6)以验证是否包含此字符,即使未显示。(许多其他字符代码,例如32以下的字符代码,也不会在标准控制台中呈现为字符。)这个答案对于普通人来说更容易理解。
bb := []byte{'h','e','l','l','o',127}
ss := string(bb)
fmt.Println(ss)
bb := []byte{'h','e','l','l','o',127}