golang:[] byte(string)vs [] byte(*string)

sta*_*wer 2 string type-conversion go slice

我很好奇为什么Golang没有提供[]byte(*string)方法.从性能的角度来看,不会[]byte(string)复制输入参数并增加更多的成本(虽然这看起来很奇怪,因为字符串是不可变的,为什么要复制它们)?

我是Go的新手,非常感谢任何澄清.

icz*_*cza 14

[]byte("something")不是函数(或方法)调用,它是类型转换.

类型转换"本身"不会复制该值.然而,将a转换string为a []byte确实需要,因为结果字节切片是可变的,并且如果不进行复制,则可以修改/更改不可变string值(内容string),它必须为该规格:字符串类型的部分规定:

字符串是不可变的:一旦创建,就不可能改变字符串的内容.

请注意,由于编译器"远离"优化了string<=> []byte转换未进行复制,因此很少会出现这种情况.当有证据证明不可变string不能/不会最终修改时,这些是罕见的和"硬编码"的情况.

这样的示例是从键类型所在的地图中查找值string,并使用a索引地图,当然[]byte转换为string():

key := []byte("some key")

var m map[string]T
// ...
v, ok := m[string(key)]  // Copying key here is optimized away
Run Code Online (Sandbox Code Playgroud)

另一个优化是在string显式转换为字节切片的字节范围内进行测距:

s := "something"
for i, v := range []byte(s) { // Copying s is optimized away
    // ...
}
Run Code Online (Sandbox Code Playgroud)

(注意,如果没有转换,for range则会迭代rune字符串的s而不是其UTF8编码的字节.)

  • 仅供参考,有一个针对不可变字节数组的功能请求 https://github.com/golang/go/issues/2205 (2认同)

Fli*_*mzy 5

我很好奇为什么 Golang 不提供 []byte(*string) 方法。

因为这没有意义。

指针(指向任何类型)不能(以任何明显有意义的方式)表示为[]byte.

从性能角度来看, []byte(string) 不会复制输入参数并增加更多成本(尽管这看起来很奇怪,因为字符串是不可变的,为什么要复制它们)?

[]byte从到 的转换string(反之亦然)确实涉及副本,因为字符串是不可变的,但字节数组不是。

然而,使用指针并不能解决这个问题。