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")
据我所知,在运行时,这将:

  • 使用内存中的值创建一个字符串
  • 创建一个字节片
  • 将字符串的内容复制到字节片中(根据需要重新分配)
  • 我可以将每个字符串值转换为其ASCII等效值,并直接创建字节片:

    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”)将很有帮助的地方。这篇文章来自于检查编译器生成的汇编程序。