Encoding 使用已知的文本字符串创建字节片(Golang)
我想把这个文本放在一个字节片中:Encoding 使用已知的文本字符串创建字节片(Golang),encoding,go,Encoding,Go,我想把这个文本放在一个字节片中: s := "There are these two young fish swimming along and they happen to meet an older fish swimming the other way" 如果我写 b := []byte("There are these two young fish swimming along and they happen to meet an older fish swimming the oth
s := "There are these two young fish swimming along and they happen to meet an older fish swimming the other way"
如果我写
b := []byte("There are these two young fish swimming along and they happen to meet an older fish swimming the other way")
据我所知,在运行时,这将:
b := []byte{84, 104, ... }
虽然这不是很可读
我知道这里的例子有点琐碎,大多数计算机都能在瞬间完成,但我对此很好奇。编译器是否解释了
[]字节(“blah”)
,并在编译时将其转换为有效的字节片?如果字符串包含非ASCII字符,最佳解决方案是否会改变?Go将字符串作为字符串文本嵌入可执行程序中。它在运行时使用运行时.stringtoslicebyte
函数将字符串文字转换为字节片。如果您要从常量字符串初始化[]字节
变量,编译器看起来足够聪明,不会创建中间字符串:相反,字节片的后备数组直接从静态数据初始化,而不是首先构造字符串变量
有一个数据副本,但在构造可变类型时,这是意料之中的。这些转换是最内部计算循环的一部分吗?这是在分析中出现的瓶颈吗?GC速度慢是因为您通过这种转换生成了太多的垃圾吗?如果否:为什么要麻烦?“如果字符串包含非ASCII字符,最佳解决方案会改变吗?”否。Go源代码是utf8;类似于
for,chr:=range str{…}
循环句柄utf8;您的程序可能不需要为处理utf-8做任何特殊的准备。不要认为它会“根据需要重新分配”,因为它已经知道字符串中有多少字节,所以它可以提前获取足够的内存。列出字节似乎是一个非常糟糕的主意(使您的源代码难看),我不确定它的执行效率是否会更高;由于字节片是可变的,因此可能仍然需要将字节从常量land复制到堆内存。此外,正如沃尔克所说,在初创公司复制的任何纳秒都不是什么大问题。沃尔克,因为我对这门语言还不熟悉,我想知道到底发生了什么。彼得索的答案在这里看起来不错。Rob Pike在一篇关于Go字符串(包括非ASCII字符)如何工作的文章中提到了您在这里看到的(基于“it looke like”)将很有帮助的地方。这篇文章来自于检查编译器生成的汇编程序。