2 回答

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
在 Go 中,字符串值是read-only
字節(jié)切片,您無(wú)法更改其元素(不可變)。由于它是一個(gè)切片,因此意味著它有一個(gè)已定義容量的支持(底層)數(shù)組。話雖這么說(shuō),我們可以說(shuō)字符串是一個(gè)指向只讀后備數(shù)組的數(shù)據(jù)結(jié)構(gòu)。
字符串針對(duì)高可重用性進(jìn)行了優(yōu)化,因此是只讀的。每當(dāng)您修改字符串時(shí),都會(huì)在后臺(tái)創(chuàng)建一個(gè)新字符串(字節(jié)切片),這使得操作成本較高。一項(xiàng)建議是將字符串轉(zhuǎn)換為實(shí)際的字節(jié)切片[]byte(string)
并使用字節(jié),或者當(dāng)程序需要執(zhí)行大量字符串操作時(shí)使用strings.Builder 。
s := "Hello" // backing array for "hello" created; `s` points to the backing array
t := s // `t` a new string structure and points to the same backing array as `s`,?
s += "World" // new backing array created for "HelloWorld"; `s` points to the new backing array
t += "There" // `t` was still pointing to "Hello" and with this operation, a new backing array is created for "HelloThere" and `t` points to it

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
經(jīng)過(guò)評(píng)論部分對(duì)此進(jìn)行了大量辯論/討論后,這是我的結(jié)論。
Golang 沒(méi)有寫時(shí)復(fù)制。
這里的+=是顯式創(chuàng)建一個(gè)新字符串,相當(dāng)于s = s + "World"創(chuàng)建一個(gè)新字符串并將其分配回s
如果你嘗試編寫以下代碼,由于 Golang 字符串的不可變性,將會(huì)導(dǎo)致編譯錯(cuò)誤
t[0] = 'A' // cannot assign to t[0]
因此,Golang 中的所有內(nèi)容都是顯式的,Golang 沒(méi)有隱式執(zhí)行任何操作。這就是 Golang 中不存在寫時(shí)復(fù)制的原因。
注意:COW 和不變性并不相互排斥。
- 2 回答
- 0 關(guān)注
- 212 瀏覽
添加回答
舉報(bào)