在 go 中,`string` 与 `[]byte` 之间的双向转换(`[]byte(s)` 和 `string(b)`)均会分配新
内存,无法避免拷贝,这是由字符串不可变性及底层内存模型决定的核心行为。
Go 的 string 类型是不可变的只读字节序列,其底层结构包含一个指向底层字节数组的指针和长度字段(不包含容量)。而 []byte 是可变的切片,拥有独立的底层数组指针、长度和容量三元组。正因如此,任何类型转换都必须保证语义安全:
s := "hello world"
b := []byte(s) // ✅ 分配新内存,b 与 s 数据独立
b[0] = 'H'
fmt.Println(s) // 输出 "hello world"(不变)
fmt.Println(string(b)) // 输出 "Hello world"
// 反向亦然
b2 := []byte{1, 2, 3, 4, 5}
s2 := string(b2) // ✅ 再次分配新内存
b2[0] = 99
fmt.Println(s2) // 输出 "\x01\x02\x03\x04\x05"(不受影响)⚠️ 重要注意事项:
简言之:string ↔ []byte 转换 = 深拷贝。理解这一点,是写出高效、内存友好的 Go 字符串处理代码的前提。