Go - strings

數(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)這一目的。

  1. 先將這段內(nèi)存拷貝到堆或者棧上;
  2. 將變量的類型轉(zhuǎn)換成 []byte 后并修改字節(jié)數(shù)據(jù);
  3. 將修改后的字節(jié)數(shù)組轉(zhuǎn)換回 string;
func main() {
    s := "hello"
    b := []byte(s)
    b[0] = 'q'
    s = string(b)
    fmt.Println("qqq: ", s)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容