「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go の埋め込み構造体: 値によって埋め込むのとポインターによって埋め込むのはどちらがよいか?

Go の埋め込み構造体: 値によって埋め込むのとポインターによって埋め込むのはどちらがよいか?

2024 年 11 月 4 日に公開
ブラウズ:327

Embedded Structs in Go: When to Embed by Value vs. by Pointer?

Go の埋め込み構造体: ポインタとオブジェクト

ポインタ レシーバを扱うときとポインタ型を構築するとき、構造体の埋め込みの違いを理解するオブジェクト (B) とポインター (*B) の違いが重要になります。このコンテキストでは、これら 2 つの埋め込み構造体タイプのゼロ値は大きく異なります。

直接埋め込み (オブジェクト)

ポインター レシーバーを持つ構造体 B が次のように直接埋め込まれている場合構造体 A 内のオブジェクトのゼロ値には、それ自体がゼロ値を持つタイプ B の埋め込みオブジェクトが含まれています。開発者は、この埋め込みオブジェクトとそのメソッドに安全にアクセスできます。

type B struct {
    X int
}

func (b *B) Print() { fmt.Printf("%d\n", b.X) }

type AObj struct {
    B
}

var aObj AObj
aObj.Print() // prints 0

Pointer Embedding

対照的に、B (*B) へのポインターを埋め込むと、別のシナリオが作成されます。この埋め込み構造体のゼロ値には nil ポインター値があり、直接使用できなくなります。

type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics

オブジェクトのコピー

AObj オブジェクトが作成されると、埋め込まれた B オブジェクトのコピーが取得されます。コピーに加えられた変更は、元のオブジェクトには影響しません。

aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0

Pointer Copying

APtrを使用すると、新しいオブジェクトを作成するとポインタ(*B)がコピーされますが、基になる具体的なオブジェクトはコピーされません。に。したがって、新しいオブジェクトを変更すると、元のオブジェクトと新しいオブジェクトの両方に影響します。

aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1

構造体をオブジェクトとして埋め込むかポインターとして埋め込むかを決定するときは、特定のユースケースと要件を考慮することが重要です。この決定は、ゼロ初期化、コピー動作、オブジェクトの所有権などの要因に影響を与える可能性があります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3