數(shù)據(jù)結(jié)構(gòu)
type StringHeader struct {
Data uintptr // 指向字節(jié)數(shù)組的指針
Len int // 數(shù)組的大小
}
與切片的數(shù)據(jù)結(jié)構(gòu)相比,少了cap,是一個只讀的切片
因為字符串作為只讀的類型,我們并不會直接向字符串直接追加元素改變其本身的內(nèi)存空間,所有在字符串上的寫入操作都是通過拷貝實現(xiàn)的。
拼接和拷貝
運行時會調(diào)用 copy 將輸入的多個字符串拷貝到目標(biāo)字符串所在的內(nèi)存空間。新的字符串是一片新的內(nèi)存空間,與原來的字符串也沒有任何關(guān)聯(lián),一旦需要拼接的字符串非常大,拷貝帶來的性能損失是無法忽略的。
[]byte與string轉(zhuǎn)換
go語言不支持直接修改string類型變量的內(nèi)存空間,可以通過在string和[]byte類型之間反復(fù)轉(zhuǎn)換實現(xiàn)這一目的。
- 先將這段內(nèi)存拷貝到堆或者棧上;
- 將變量的類型轉(zhuǎn)換成 []byte 后并修改字節(jié)數(shù)據(jù);
- 將修改后的字節(jié)數(shù)組轉(zhuǎn)換回 string;
func main() {
s := "hello"
b := []byte(s)
b[0] = 'q'
s = string(b)
fmt.Println("qqq: ", s)
}