入れ子になった複合リテラルを使用して合成構造体を初期化する
Go では、他の構造体を埋め込むときに合成構造体を初期化するのが難しい場合があります。 child := Child{ ID: id, a: a, b: b } の元の構文では、埋め込みフィールド ID を直接初期化できないため、エラーが発生する可能性があります。
この問題を克服し、維持するにはカプセル化、ネストされた複合リテラルを使用します:
child := Child{ Base: Base{ID: id}, // Initialize the embedded struct a: a, b: b, }
このアプローチにより、カプセル化を維持しながら、単一の式で構成された構造体を初期化できます。埋め込み構造体の初期化をネストします。
質問で示唆されているように、別の解決策は、NewFoo() のようなファクトリ メソッドを使用することです。ただし、ネストされた複合リテラルは、より簡潔で安全な代替手段を提供します。
複合リテラルの変更案
Go issue 9859 では、サポートする複合リテラルの構文の変更が提案されています。埋め込みフィールドを直接初期化します。この変更により、 child := Child{ ID: id, a: a, b: b } の元の構文が有効になります。
カプセル化に関する考慮事項
構造体の埋め込みは禁止されていますGo の厳密なカプセル化機能。埋め込みフィールドへの間接的なアクセスは許可されますが、強制はされません。コードは、child.ID を使用するだけでなく、child.Base.ID に直接アクセスすることもできます。したがって、カプセル化の責任は最終的にはアプリケーションの設計と使用法にあります。
以上が複合リテラルを使用して Go で埋め込み構造体を効率的に初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。