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