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

时间:2017-04-18 10:57:50

标签: string go type-conversion slice

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

我是Go的新手,并希望得到任何澄清。

2 个答案:

答案 0 :(得分:14)

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

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

  

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

请注意,string< =>的情况很少。 []byte转换不会制作副本,因为它已经过优化"远离"由编译器。这些是罕见的,并且经过严格编码"有证据表明不可变string不能/不会最终被修改的情况。

这样的示例是从密钥类型为string的地图中查找值,并使用[]byte为地图编制索引,当然转换为string({{ 3}}):

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

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

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

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

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

答案 1 :(得分:2)

  

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

因为没有意义。

指针(对任何类型)都不能用[]byte表示(以任何明显有意义的方式)。

  

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

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

但是,使用指针无法解决该问题。