為什么說 Go 語言字符串是不可變的?
原文鏈接: 為什么說 Go 語言字符串是不可變的?
最近有讀者留言說,平時在寫代碼的過程中,是會對字符串進行修改的,但網(wǎng)上都說 Go 語言字符串是不可變的,這是為什么呢?
這個問題本身并不困難,但對于新手來說確實容易產(chǎn)生困惑,今天就來回答一下。
首先來看看它的底層結(jié)構(gòu):
type stringStruct struct {
str unsafe.Pointer
len int
}
和切片的結(jié)構(gòu)很像,只不過少了一個表示容量的 cap 字段。
str:指向一個[]byte類型的指針len:字符串的長度
所以,當我們定義一個字符串:
s := "Hello World"
那么它在內(nèi)存中存儲是這樣的:

當我們在程序中對字符串進行重新賦值時,比如這樣:
s := "Hello World"
s = "Hello AlwaysBeta"
底層的存儲就變成了這樣:
.png)
Go 實際上是重新創(chuàng)建了一個 []byte{} 切片,然后讓指針指向了新的地址。
更直接一點,我們直接修改字符串中的單個字符,比如:
s := "Hello World"
s[0] = 'h'
這樣做的話,會直接報錯:
cannot assign to s[0] (strings are immutable)
如果一定要這么做的話,需要對字符串進行一個轉(zhuǎn)換,轉(zhuǎn)換成 []byte 類型,修改之后再轉(zhuǎn)換回 string 類型:
s := "Hello World"
sBytes := []byte(s)
sBytes[0] = 'h'
s = string(sBytes)
這樣就可以了。
以上就是本文的全部內(nèi)容,如果覺得還不錯的話歡迎點贊,轉(zhuǎn)發(fā)和關注,感謝支持。
推薦閱讀:

浙公網(wǎng)安備 33010602011771號