ホームページ > バックエンド開発 > Golang > Go Structs: 逆参照するとコピーまたは参照が作成されますか?

Go Structs: 逆参照するとコピーまたは参照が作成されますか?

DDD
リリース: 2024-11-30 06:48:15
オリジナル
571 人が閲覧しました

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

Go での構造体の逆参照: コピーと参照の解明

Go では、* 演算子を使用して構造体を逆参照すると、新しいオブジェクトが返されるように見える場合があります。元のアドレスの代わりに構造体のコピー。これは誤解を招く可能性があります。

次のコードを考えてみましょう:

type me struct {
    color string
    total int
}
ログイン後にコピー

このコードでは、me という名前の構造体を定義します。

スタディ関数内で、 me struct p を作成し、その color フィールドを初期化します。次に、&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 は、*p の値に初期化された me 型の新しい変数です。これにより、obj は別のメモリ アドレスを持つようになります。

obj は me 型であり、p は *me 型であることに注意することが重要です。これらは異なる値です。 obj フィールドを変更しても、p 内のフィールドには影響しません。

元の構造体を変更したい場合は、以下を使用できます。

obj := p
// equivalent to: var obj *me = p
ログイン後にコピー

この場合、obj は同じオブジェクトを指します。 pとしてこれらは異なるアドレスを持っていますが、実際の me オブジェクト内では同じアドレスを保持しています。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート