Go語言修改字串

2020-07-16 10:04:21
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 可以通過強制型別轉換互轉。