Go 解引用:是否複製,這是問題
使用解引用運算子 (*) 存取 Go結構體時,使用者可能會想知道結果是結構的新副本還是對原始結構的引用
理解行為
在提供的程式碼片段中:
type me struct { color string total int } func study() *me { p := me{} return &p } obj := *study()
study() 傳回一個指向me 結構的指標。在 obj 中取消引用它會建立該結構的副本。這從 &p.color 和 &obj.color 的記憶體位址中可以明顯看出,它們是不同的。
人們可能期望解除引用的 struct obj 與原始結構具有相同的記憶體位址,但情況並非如此這個例子。這種行為可以歸因於 Go 在變數作用域末尾自動釋放變數。
當它實際上是一個引用時
要實現引用行為,可以分配一個使用以下方式直接指向結構體:
obj := study()
在這種情況下, obj 將是指向原始me 結構體的指針,並且對p 或obj 的更改都會影響相同的底層結構。
結論
在Go 中取消引用結構時,重要的是要了解結果是以下內容的副本原始結構,除非明確分配了指向該結構的指針。此行為確保對取消引用的結構所做的更改不會影響原始結構,從而保持封裝和變數獨立性。
以上是Go 的解引用運算子是否建立原始結構的副本或參考?的詳細內容。更多資訊請關注PHP中文網其他相關文章!