我很好奇,为什么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
(反之亦然(确实涉及副本,因为字符串是不变的,但字节数组不是。
但是,使用指针无法解决该问题。