Go 語言的字串無法直接修改每一個字元元素,只能通過重新構造新的字串並賦值給原來的字串變數實現。請參考下面的程式碼:
angel := "Heros never die"
angleBytes := []byte(angel)
for i := 5; i <= 10; i++ {
angleBytes[i] = ' '
}
fmt.Println(string(angleBytes))
程式輸出如下:
Heros die
程式碼說明如下:
-
在第 3 行中,將字串轉為字串陣列。
-
第 5~7 行利用迴圈,將 never 單詞替換為空格。
-
最後列印結果。
感覺我們通過程式碼達成了修改字串的過程,但真實的情況是:Go 語言中的字串和其他高階語言(Java、C#)一樣,預設是不可變的(immutable)。
字串不可變有很多好處,如天生執行緒安全,大家使用的都是唯讀物件,無須加鎖;再者,方便記憶體共用,而不必使用寫時複製(Copy On Write)等技術;字串 hash 值也只需要製作一份。
所以說,程式碼中實際修改的是 []byte,[]byte 在 Go 語言中是可變的,本身就是一個切片。
在完成了對 []byte 操作後,在第 9 行,使用 string() 將 []byte 轉為字串時,重新創造了一個新的字串。
總結
-
Go 語言的字串是不可變的。
-
修改字串時,可以將字串轉換為 []byte 進行修改。
-
[]byte 和 string 可以通過強制型別轉換互轉。