C のようなオブジェクト指向言語の継承の概念により、複雑な型の階層を作成できます。ただし、クラスと継承のない Go 言語では、階層構造を表現する際に独特の課題が生じます。
Go コンパイラーでは、型の階層は、空のメソッドを持つインターフェイスを使用して表現されます。 Go の FAQ では、インターフェースの実装を明示的に保証するこのアプローチを提案していますが、空のメソッドが過剰に多くなる可能性があります。
Go は、構造体とインターフェースの両方の埋め込みをサポートしています。空のメソッドは、型がインターフェイスを明示的に実装することを保証するために導入され、それによって型割り当ての非互換性を防ぎます。
別のアプローチは、高レベルの型を埋め込む構造体の実装を作成することです。 。これにより、メソッド セットの自動継承が可能になり、空のメソッドの必要性が減ります。
たとえば、階層を考えてみます:
Object --Immovable ----Building ----Mountain --Movable ----Car ----Bike
オブジェクト インターフェイスと実装:
type Object interface { object() } type ObjectImpl struct {} func (o *ObjectImpl) object() {}
不動のインターフェースと実装:
type Immovable interface { Object immovable() } type ImmovableImpl struct { ObjectImpl // Embedded } func (i *ImmovableImpl) immovable() {}
建物struct:
type Building struct { ImmovableImpl // Embedded }
ImmovableImpl 構造体を埋め込むことにより、Building は追加の空のメソッドを必要とせずに immovable() メソッドを自動的に継承します。この手法により、特に階層が成長する場合やインターフェイスに複数のメソッドが含まれる場合に、必要な空のメソッドの数が最小限に抑えられます。
以上がGo で構造体の複雑な階層を慣用的に作成するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。