首頁 > 後端開發 > Golang > Go 結構:取消引用會建立副本還是引用?

Go 結構:取消引用會建立副本還是引用?

DDD
發布: 2024-11-30 06:48:15
原創
556 人瀏覽過

Go Structs: Does Dereferencing Create a Copy or a Reference?

Go 中解引用結構:揭示複製與引用

在Go 中,使用* 運算子解引用結構可能會傳回一個新值結構的副本而不是原始位址。這可能會導致誤解。

考慮以下程式碼:

type me struct {
    color string
    total int
}
登入後複製

在這段程式碼中,我們定義了一個名為 me 的結構體。

在 Study 函數中,我們建立一個 me struct p 並初始化它的顏色欄位。然後我們使用 &p 返回 p 的位址。

func study() *me {
    p := me{}
    p.color = "tomato"
    return &p
}
登入後複製

在 main 函數中,我們取得 p.color 的位址並將其儲存在 &p.color 中。然後我們取消引用 p 並將結果儲存在 obj 中。

func main() {
    p := study()
    obj := *p
}
登入後複製

現在,讓我們檢查輸出:

&p.color = 0x10434120
&obj.color = 0x10434140   //different than &p.color!
登入後複製

當我們比較 &p.color 和 &obj.color 時,我們發現他們有不同的地址。這可能表明,當我們取消引用 p 時,我們創建了該結構的新副本。

但是,情況並非如此。當我們使用 *p 時,我們正在複製 p 指向的結構體的值。相當於使用:

var obj me = *p
登入後複製

obj 是一個 me 類型的新變量,初始化為 *p 的值。這導致 obj 有一個單獨的記憶體位址。

要注意的是 obj 是 me 型,而 p 是 *me 型。它們是不同的價值。更改 obj 字段不會影響 p 內的字段。

如果我們想要修改原始結構體,可以使用:

obj := p
// equivalent to: var obj *me = p
登入後複製

在這種情況下,obj 指向同一個物件作為p。它們具有不同的位址,但在實際的 me 物件中保存相同的位址。

以上是Go 結構:取消引用會建立副本還是引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板