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 可以通過強制類型轉換互轉。