爲什麼說 Go 語言字符串是不可變的?

最近有讀者留言說,平時在寫代碼的過程中,是會對字符串進行修改的,但網上都說 Go 語言字符串是不可變的,這是爲什麼呢?

這個問題本身並不困難,但對於新手來說確實容易產生困惑,今天就來回答一下。

首先來看看它的底層結構:

type stringStruct struct {
    str unsafe.Pointer
    len int
}

和切片的結構很像,只不過少了一個表示容量的 cap 字段。

所以,當我們定義一個字符串:

s := "Hello World"

那麼它在內存中存儲是這樣的:

當我們在程序中對字符串進行重新賦值時,比如這樣:

s := "Hello World"

s = "Hello AlwaysBeta"

底層的存儲就變成了這樣:

Go 實際上是重新創建了一個 []byte{} 切片,然後讓指針指向了新的地址。

更直接一點,我們直接修改字符串中的單個字符,比如:

s := "Hello World"
s[0] = 'h'

這樣做的話,會直接報錯:

cannot assign to s[0] (strings are immutable)

如果一定要這麼做的話,需要對字符串進行一個轉換,轉換成 []byte 類型,修改之後再轉換回 string 類型:

s := "Hello World"
sBytes := []byte(s)
sBytes[0] = 'h'
s = string(sBytes)

這樣就可以了。


本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/AOb6AjKwyTwLeAUou0AU-Q