Go で合成された構造体の初期化
Go で構造体を合成するには、ある構造体を別の構造体内に埋め込む必要があります。この手法にはコードの編成と再利用という利点がありますが、初期化の問題も発生する可能性があります。
合成された構造体を初期化する場合、埋め込まれた構造体のフィールドに直接アクセスできない場合があります。次のコード例を考えてみましょう。
type Base struct { ID string } type Child struct { Base a int b int } // Error: unknown field 'ID' in struct literal of type Child // child := Child{ ID: id, a: a, b: b }
この例では、子構造体リテラルで ID フィールドを直接初期化しようとすると、フィールドにアクセスできないため失敗します。この問題を回避するには、まず ID なしで子構造体を初期化し、次に ID を個別に設定する必要があります。
ただし、このアプローチでは、子構造体の内部構造がユーザーに公開されるため、カプセル化が損なわれます。これを回避するために、Go は合成構造体を安全に初期化するためのメソッドを提供しています: ネストされた複合リテラル。単一の式内:
この例では、まず、Base 構造体が初期化され、ID フィールドが目的の値に設定されます。結果の Base 構造体は、Child struct の初期化に使用されます。
Alternative Approach
child := Child{Base: Base{ID: id}, a: a, b: b}
Go issue 9859 では、埋め込み構造体の初期化を簡素化する変更が提案されています。この変更により、Child{ ID: id, a: a, b: b } 式が許可され、埋め込み型のフィールド アクセスとの一貫性が保たれます。
カプセル化に関する考慮事項
埋め込み型は Go で真のカプセル化を提供しないことに注意することが重要です。アプリケーションは、囲んでいる構造体のメソッドをバイパスして、埋め込まれた構造体のフィールドに直接アクセスできます。したがって、構造体を設計するときは、カプセル化の必要性を慎重に検討してください。
以上がGoで構成された構造体を適切に初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。