[]byte(字符串) 与 []byte(*字符串)

2023-12-22

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


[]byte("something")不是函数(或方法)调用,而是类型转换 https://golang.org/ref/spec#Conversions.

类型转换“本身”不会复制该值。转换一个string to a []byte然而确实如此,而且需要如此,因为结果字节切片是mutable,如果不制作副本,您可以修改/更改string值(内容string) 这是不可变的,它必须是作为规范:字符串类型 https://golang.org/ref/spec#String_types部分规定:

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

请注意,少数情况下string[]byte转换不会复制,因为它被编译器“优化”掉了。当有证据证明不可变时,这些是罕见的“硬编码”情况string不能/不会最终被修改。

这样的示例是从键类型为的映射中查找值string,然后你用一个索引来索引地图[]byte, 转换成string当然 (source https://github.com/golang/go/issues/3512):

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

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

另一个优化是当范围超过 a 的字节时string显式转换为字节切片:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[]byte(字符串) 与 []byte(*字符串) 的相关文章

随机推荐