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

取消引用 Go 結構會建立新副本嗎?

Patricia Arquette
發布: 2024-12-01 04:58:13
原創
546 人瀏覽過

Does Dereferencing a Go Struct Create a New Copy?

在 Go 中解引用結構體會建立新副本嗎?

在 Go 中,當結構體類型的變數透過引用傳遞時,使用星號 (*)運算符,可能會產生誤解,認為取消引用的變數表示與原始變數相同的位址struct.

但是,如給定的程式碼片段所示:

package main

import (
    "fmt"
)

type me struct {
    color string
    total int
}

func study() *me {
    p := me{}
    p.color = "tomato"
    fmt.Printf("%p\n", &p.color) // Address of p.color
    return &p
}

func main() {
    p := study() // p is a pointer to a struct
    fmt.Printf("&p.color = %p\n", &p.color) // Address of p.color

    obj := *p // obj is a copy of the struct pointed to by p
    fmt.Printf("&obj.color = %p\n", &obj.color) // Address of obj.color

    fmt.Printf("obj = %+v\n", obj)

    p.color = "purple" // Changes color of the struct pointed by p
    fmt.Printf("p.color = %p\n", &p.color)
    fmt.Printf("p = %+v\n", p)
    fmt.Printf("obj  = %+v\n", obj)

    obj2 := *p // Another copy is made
    fmt.Printf("obj2 = %+v\n", obj2)
}
登入後複製

當我們執行此程式碼時,輸出顯示取消引用的變數obj 的位址與原始struct p 的位址不同。這是因為:

取消引用會建立一個新副本:

行obj := *p 建立一個與p (me) 型別相同的新變數obj,並使用p 指向的值的副本對其進行初始化。這意味著對 obj 所做的任何更改都不會影響原始結構。

有效地將新的結構值分配給另一個:

類似於var obj me = *p , obj := *p 中的解引用操作將一個新的結構體值賦給變數obj。這將創建一個具有單獨記憶體的新副本。

謹慎使用星號運算子:

雖然星號運算子提供了指標語義,但了解其對變數的影響非常重要。當使用 *(取消引用)運算子分配值時,它會建立一個新副本,而不是對原始變數的新引用。

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

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