[]字节(字符串)vs []字节(*string)



我很好奇,为什么GO不提供[]byte(*string)方法。从性能的角度来看,[]byte(string)不会制作输入参数的副本并添加更多成本(尽管这似乎是奇怪的,因为字符串是不变的,为什么要复制它们(?

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

类型转换"本身"不复制值。但是,将string转换为 []byte,并且需要,因为结果字节slice是 cuttable ,如果未制作副本,则可以修改/更改string值(string(是不可变的,它必须是规格:字符串类型部分指示:

字符串是不变的:创建后,不可能更改字符串的内容。

请注意,string< => []byte转换的情况很少,因为编译器将其"远离"时不会制作副本。当有不变的string无法/不会被修改时,这些都是罕见且"硬编码"的案例。

这样的示例是从密钥类型为 string的地图中查找一个值,然后用[]byte索引地图,当然转换为string(来源(:

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 s上迭代,而不是在其UTF8编码的字节上迭代。(

我很好奇,为什么Golang不提供[]字节(*String(方法。

因为这没有意义。

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

从性能的角度来看,不会[]字节(字符串(制作输入参数并添加更多成本(尽管这似乎是奇怪的,因为字符串是不变的,为什么要复制它们(?

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

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

最新更新