我很好奇为什么 Go 不提供 []byte(*string)
方法。从性能的角度来看,[]byte(string)
不会复制输入参数并增加更多成本(尽管这看起来很奇怪,因为字符串是不可变的,为什么要复制它们)?
最佳答案
[]byte("something")
不是函数(或方法)调用,它是类型 conversion。
类型转换“本身”不会复制值。然而,将 string
转换为 []byte
确实需要,因为结果字节 slice 是可变的,如果一个副本会不被制作,你可以修改/改变 string
值(string
的内容)它是不可变的,它必须是 Spec: String types部分规定:
Strings are immutable: once created, it is impossible to change the contents of a string.
请注意,在极少数情况下,string
<=> []byte
转换不会生成副本,因为它已被编译器优化“离开”。当有证据表明不可变的 string
不能/不会最终被修改时,这些是罕见的“硬编码”情况。
这样的例子是从键类型为 string
的映射中查找一个值,然后您使用 []byte
索引该映射,转换为 字符串
当然是(source):
key := []byte("some key")
var m map[string]T
// ...
v, ok := m[string(key)] // Copying key here is optimized away
另一个优化是遍历显式转换为字节 slice 的 string
的字节:
s := "something"
for i, v := range []byte(s) { // Copying s is optimized away
// ...
}
(请注意,如果不进行转换,for range
将遍历字符串的 rune
而不是其 UTF8 编码字节。)
关于string - []字节(字符串)与[]字节(*字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43470284/