原文鏈接: 為什么說 Go 語言字串是不可變的?
最近有讀者留言說,平時在寫代碼的程序中,是會對字串進行修改的,但網上都說 Go 語言字串是不可變的,這是為什么呢?
這個問題本身并不困難,但對于新手來說確實容易產生困惑,今天就來回答一下,
首先來看看它的底層結構:
type stringStruct struct {
str unsafe.Pointer
len int
}
和切片的結構很像,只不過少了一個表示容量的 cap 欄位,
str:指向一個[]byte型別的指標len:字串的長度
所以,當我們定義一個字串:
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)
這樣就可以了,
以上就是本文的全部內容,如果覺得還不錯的話歡迎點贊,轉發和關注,感謝支持,
推薦閱讀:
- Go 語言 map 如何順序讀取?
- Go 語言 map 是并發安全的嗎?
- Go 語言切片是如何擴容的?
- Go 語言陣列和切片的區別
- Go 語言 new 和 make 關鍵字的區別
- 為什么 Go 不支持 []T 轉換為 []interface
- 為什么 Go 語言 struct 要使用 tags
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554146.html
標籤:其他
上一篇:JAVA Socket編程
下一篇:返回列表
