1.6 字符串
Go 的 string 本质是一个只读的字节序列,底层由 data 指针与 len 长度两个字段组成,不携带容量(cap)字段。
不可变与转换开销
字符串不可变,因此 []byte(s) 与 string(b) 在多数实现中会发生一次内存拷贝。高频路径上应尽量避免反复互转:
// 不必要的拷贝
for i := 0; i < n; i++ {
_ = []byte(prefix + s) // 每次都分配
}
字符串拼接
少量拼接优先使用 strings.Builder,避免在循环中使用 + 产生多次分配:
var b strings.Builder
for _, s := range parts {
b.WriteString(s)
}
result := b.String()
小结
- 字符串是不可变的字节序列,无容量概念;
- 与
[]byte互转会发生拷贝,注意热路径上的开销; - 拼接优先
strings.Builder。
下一节我们将进入映射(map)的实现细节。
