string - []字节(字符串)与[]字节(*字符串)

标签 string go type-conversion slice

我很好奇为什么 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/

相关文章:

c++ - 从 ‘const char*’ 到 ‘unsigned char*’ 的无效转换

Python - 小数位(将 float 放入字符串中)

string - 如何定义自定义字母顺序以在 go 中比较和排序字符串?

json - 如何在 Go 中进行嵌套的 JSON 响应?

networking - 在 Go 中将结构转换为字节 slice 的紧凑方法是什么?

c# - 请给我 C# 中隐式和显式类型转换的示例

clojure - 尝试在 Clojure 中映射 parseInt 时出现奇怪的错误

javascript - 如果存在,则在字符第 3 次出现后替换所有内容

Python:什么是 String[a:b] 的等价物,但对于 Unicode

go - 如何读取3个json文件