ホームページ > バックエンド開発 > Golang > 埋め込み構造体と構造体へのポインタ: ゼロ値とコピーはどうなりますか?

埋め込み構造体と構造体へのポインタ: ゼロ値とコピーはどうなりますか?

DDD
リリース: 2024-10-30 09:12:03
オリジナル
340 人が閲覧しました

Embedded Struct vs Pointer to Struct: What's the Deal with Zero Values and Copying?

埋め込み構造体と構造体へのポインター: ゼロ値とコピーへの影響

構造体型をポインターとして使用する場合 (つまり、ポインター レシーバーを使用すると、コンストラクターが A など)、構造体 (B として) を埋め込むか、そのポインター (B として) を埋め込むかの選択は、微妙ですが重要な結果をもたらします。

ゼロ値

2 つのオプションのゼロ値は大きく異なります。埋め込み B は、値が 0 の埋め込みオブジェクトを直接作成します。これにより、そのオブジェクトに対する即時操作が可能になります。

<code class="go">type AObj struct { B }
var aObj AObj
aObj.Print() // Prints 0 (B's zero value)</code>
ログイン後にコピー
対照的に、*B を埋め込むと、値が nil ポインタでゼロになり、直接使用できなくなります。

<code class="go">type APtr struct { *B }
var aPtr APtr
aPtr.Print() // Panics (nil pointer dereference)</code>
ログイン後にコピー

Copying

オブジェクトのコピー動作は、埋め込みタイプによって異なります。 B がオブジェクトとして埋め込まれている場合、コピー時に新しいオブジェクトが作成されます。

<code class="go">type AObj struct { B }
aObj2 := aObj
aObj.X = 1
aObj2.Print() // Prints 0 (copy of B's zero value)</code>
ログイン後にコピー
逆に、ポインタ埋め込み (*B) では、元のオブジェクトとコピーされたオブジェクトの両方が同じ基礎となる B オブジェクトを共有するため、同期が可能になります。変更点:

<code class="go">type APtr struct { *B }
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // Prints 1 (shared underlying B)</code>
ログイン後にコピー
これらの違いは、コードの可読性、保守性、パフォーマンスの最適化に実際的な影響を及ぼします。構造体の埋め込みとポインターの埋め込みの微妙なニュアンスを理解することで、開発者は潜在的な落とし穴を積極的に回避し、特定のユースケースに最も適切なアプローチを活用できます。

以上が埋め込み構造体と構造体へのポインタ: ゼロ値とコピーはどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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