原文鏈接: 為什么說 Go 語言字符串是不可變的招拙?
最近有讀者留言說,平時在寫代碼的過程中喇勋,是會對字符串進(jìn)行修改的缨该,但網(wǎng)上都說 Go 語言字符串是不可變的,這是為什么呢川背?
這個問題本身并不困難贰拿,但對于新手來說確實(shí)容易產(chǎn)生困惑,今天就來回答一下熄云。
首先來看看它的底層結(jié)構(gòu):
type stringStruct struct {
str unsafe.Pointer
len int
}
和切片的結(jié)構(gòu)很像膨更,只不過少了一個表示容量的 cap
字段。
-
str
:指向一個[]byte
類型的指針 -
len
:字符串的長度
所以缴允,當(dāng)我們定義一個字符串:
s := "Hello World"
那么它在內(nèi)存中存儲是這樣的:
string.drawio.png
當(dāng)我們在程序中對字符串進(jìn)行重新賦值時荚守,比如這樣:
s := "Hello World"
s = "Hello AlwaysBeta"
底層的存儲就變成了這樣:
string.drawio (1).png
Go 實(shí)際上是重新創(chuàng)建了一個 []byte{}
切片,然后讓指針指向了新的地址练般。
更直接一點(diǎn)矗漾,我們直接修改字符串中的單個字符,比如:
s := "Hello World"
s[0] = 'h'
這樣做的話薄料,會直接報錯:
cannot assign to s[0] (strings are immutable)
如果一定要這么做的話敞贡,需要對字符串進(jìn)行一個轉(zhuǎn)換,轉(zhuǎn)換成 []byte
類型摄职,修改之后再轉(zhuǎn)換回 string
類型:
s := "Hello World"
sBytes := []byte(s)
sBytes[0] = 'h'
s = string(sBytes)
這樣就可以了嫡锌。
以上就是本文的全部內(nèi)容虑稼,如果覺得還不錯的話歡迎點(diǎn)贊,轉(zhuǎn)發(fā)和關(guān)注势木,感謝支持蛛倦。
推薦閱讀: