数据结构
type StringHeader struct {
Data uintptr // 指向字节数组的指针
Len int // 数组的大小
}
与切片的数据结构相比,少了cap,是一个只读的切片
因为字符串作为只读的类型,我们并不会直接向字符串直接追加元素改变其本身的内存空间,所有在字符串上的写入操作都是通过拷贝实现的。
拼接和拷贝
运行时会调用 copy 将输入的多个字符串拷贝到目标字符串所在的内存空间。新的字符串是一片新的内存空间,与原来的字符串也没有任何关联,一旦需要拼接的字符串非常大,拷贝带来的性能损失是无法忽略的。
[]byte与string转换
go语言不支持直接修改string类型变量的内存空间,可以通过在string和[]byte类型之间反复转换实现这一目的。
- 先将这段内存拷贝到堆或者栈上;
- 将变量的类型转换成 []byte 后并修改字节数据;
- 将修改后的字节数组转换回 string;
func main() {
s := "hello"
b := []byte(s)
b[0] = 'q'
s = string(b)
fmt.Println("qqq: ", s)
}