登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-03-08 12:36:13 312浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《golang: []byte(string) vs []byte(*string)》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

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

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

正确答案

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

类型转换“本身”不会复制值。然而,将 a 转换string为 a[]byte确实,它需要,因为结果字节切片是 mutable ,如果不会制作副本,您可以修改/更改 不可变string的值(的内容string),它必须是规范:字符串类型部分规定: __

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

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

这样的示例是从键类型为 的映射中查找值string,然后使用 a 对映射进行索引,当然[]byte转换为stringsource):

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

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

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

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

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

终于介绍完啦!小伙伴们,这篇关于《golang: []byte(string) vs []byte(*string)》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>