亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 在修改/寫入時復制字符串嗎?

Golang 在修改/寫入時復制字符串嗎?

Go
呼如林 2023-07-10 17:23:07
鑒于下面的示例,幕后實際發生了什么?package mainimport "fmt"func main() {? s := "Hello"? t := s // t shares the same data as s? s += "World" // a new string is created? t += "There" // a new string is created.? fmt.Printf("%s %s\n", s, t)}輸出:HelloWorld HelloThere問題是golang什么時候會判斷需要創建新的副本呢?
查看完整描述

2 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

在 Go 中,字符串值是read-only字節切片,您無法更改其元素(不可變)。由于它是一個切片,因此意味著它有一個已定義容量的支持(底層)數組。話雖這么說,我們可以說字符串是一個指向只讀后備數組的數據結構。

字符串針對高可重用性進行了優化,因此是只讀的。每當您修改字符串時,都會在后臺創建一個新字符串(字節切片),這使得操作成本較高。一項建議是將字符串轉換為實際的字節切片[]byte(string)并使用字節,或者當程序需要執行大量字符串操作時使用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


查看完整回答
反對 回復 2023-07-10
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

經過評論部分對此進行了大量辯論/討論后,這是我的結論。

Golang 沒有寫時復制。

這里的+=是顯式創建一個新字符串,相當于s = s + "World"創建一個新字符串并將其分配回s

如果你嘗試編寫以下代碼,由于 Golang 字符串的不可變性,將會導致編譯錯誤

t[0] = 'A' // cannot assign to t[0]

因此,Golang 中的所有內容都是顯式的,Golang 沒有隱式執行任何操作。這就是 Golang 中不存在寫時復制的原因。

注意:COW 和不變性并不相互排斥。


查看完整回答
反對 回復 2023-07-10
  • 2 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號