ホームページ >バックエンド開発 >Golang >Go 構造体の参照を解除するとコピーまたは参照が作成されますか?

Go 構造体の参照を解除するとコピーまたは参照が作成されますか?

DDD
DDDオリジナル
2024-12-13 03:11:12552ブラウズ

Does Dereferencing a Go Struct Create a Copy or a Reference?

Go での構造体の逆参照: 新しいコピーの作成

Go で構造体を操作する場合、逆参照の動作を理解することが重要です。オブジェクトを逆参照すると、基本的に、オブジェクトが指す値のコピーが返されます。これは、他の言語から来た一部のプログラマにとっては直観に反する可能性があります。通常、逆参照するとオブジェクト自体が返されます。

次の Go コード スニペットを考えてみましょう。

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)
    return &p
}

func main() {
    p := study()
    fmt.Printf("&p.color = %p\n", &p.color)

    obj := *p
    fmt.Printf("&obj.color = %p\n", &obj.color)
    fmt.Printf("obj = %+v\n", obj)

    p.color = "purple"
    fmt.Printf("p.color = %p\n", &p.color)
    fmt.Printf("p = %+v\n", p)
    fmt.Printf("obj  = %+v\n", obj)

    obj2 := *p
    fmt.Printf("obj2 = %+v\n", obj2)
}

この例では、study()関数は新しい me 構造体を作成し、それへのポインターを返します。次に、このポインターを変数 p に代入します。 p を逆参照して obj に代入すると、構造体の新しいコピーが作成されます。この新しいコピーには、p が指す元の構造体とは異なるメモリ アドレスがあります。

これは、obj のフィールドを変更しても元の構造体のフィールドには影響せず、その逆も同様であることを意味します。元の構造体への参照を作成するには、p から obj にポインターを割り当てる必要があります:

obj := p

この場合、obj と p は同じ構造体を指し、一方に加えられた変更は次のようになります。他のものに反映されます。

以上がGo 構造体の参照を解除するとコピーまたは参照が作成されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。