Go での埋め込み構造体による構造体の初期化
構造体の合成は、コードの編成と再利用のために Go で一般的に行われています。ただし、サブフィールドが埋め込み構造体から継承されている場合、合成された構造体の初期化では問題が発生する可能性があります。
次の例を考えてみましょう。
type Base struct { ID string } type Child struct { Base a int b int }
Child を初期化するには、次のメソッドを使用すると予想されるかもしれません。構文:
child := Child{ ID: id, a: a, b: b }
ただし、子構造体のフィールド ID が不明なため、コンパイル エラーが発生します。文字通り。この問題を回避するには、ID フィールドを個別に初期化する必要があります。
child := Child{ a: 23, b: 42 } child.ID = "foo"
このアプローチは、ID が埋め込みフィールドであるという事実を公開することにより、カプセル化の原則に違反します。また、パブリック フィールドを埋め込み構造体に移動すると、初期化が中断されるリスクも生じます。
この問題に対処するには、次の 2 つの推奨解決策があります。
ネストされた複合リテラル:
ネストされた複合リテラルは、単一式内の埋め込みフィールド:
child := Child{Base: Base{ID: id}, a: a, b: b}
Go での変更案:
Go の問題 9859 では、複合リテラルの一貫性を保つための変更が提案されています。埋め込み型のフィールド アクセスを使用します。この変更が実装された場合、次の構文が可能になります:
child := Child{ ID: id, a: a, b: b }
埋め込み型は本当の意味でのカプセル化を提供しないことに注意することが重要です。 child.ID 構文を使用している場合でも、アプリケーションは child.Base.ID に直接アクセスできます。
以上がGo で埋め込み構造体を効率的に初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。