差別化された Go 構造体に共有機能を追加する方法
Go では、共有する構造体に共通のメソッドを追加する必要が生じる場合があります。次の例の Guid フィールドなどの特定のフィールド:
type ModelA struct { Guid string `orm:"pk"` FiledA string } type ModelB struct { Guid string `orm:"pk"` FiledB string }
伝統的に、基本構造体を使用し、それを ModelA と ModelB に埋め込むことを検討することがあります。ただし、このアプローチは orm ライブラリとシームレスに連携しない可能性があります。
実行可能な解決策には、インターフェイスの使用が含まれます。インターフェイスを定義することで、ModelA と ModelB の両方が実装する必要がある共通のコントラクトを宣言できます。
type Savable interface { Save() }
次に、両方の構造体に Save() メソッドを実装します。
func (a ModelA) Save() { // Implementation for ModelA } func (b ModelB) Save() { // Implementation for ModelB }
Now 、Savable 型の変数を作成し、それを ModelA または ModelB に割り当てることができます:
var i Savable i = ModelA{} i.Save()
あるいは、埋め込み型のアプローチを使用することもできます:
type ModelC struct { Guid string `orm:"pk"` } type ModelA struct { ModelC FiledA string } type ModelB struct { ModelC FiledB string }
この場合、埋め込み ModelC 構造体で Save() メソッドを定義します:
func (c ModelC) Save() { // Implementation }
このアプローチは単純そうに見えますが、o.Insert(this) ステートメントは ModelC で定義されたフィールドのみを挿入し、それらのフィールドは挿入しないことに注意することが重要です。
したがって、埋め込み型を明示的に参照する必要がある場合は、埋め込みの使用を避けることをお勧めします。このような場合、インターフェースのアプローチにより柔軟性が高まります。
以上が異なるフィールドを持つ構造体に共有機能を効率的に追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。