ホームページ >バックエンド開発 >Golang >共有フィールドを持つ異なる Go 構造体に Save メソッドを効率的に実装するにはどうすればよいですか?

共有フィールドを持つ異なる Go 構造体に Save メソッドを効率的に実装するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-20 12:56:38660ブラウズ

How to Efficiently Implement a Save Method Across Dissimilar Go Structs with Shared Fields?

共有フィールドを持つ異なる構造体に Save メソッドを追加する方法

次のコンテキストを考慮してください:

type ModelA struct {
    Guid string `orm:"pk"`
    FiledA string
}

type ModelB struct {
    Guid string `orm:"pk"`
    FiledB string
}

両方の構造体 (ModelA と ModelB) に Save() メソッドを導入する必要が生じました。共通の基本構造体を作成して ModelA と ModelB に埋め込むことは可能ですが、このアプローチは ORM の制限により実行できません。

代替アプローチ: インターフェイスの実装

以下に示すように、Savable などのデータ保存用の共通インターフェイスを指定します:

type Savable interface {
   Save()
}

各構造体に Save() メソッドを実装し、それらが Savable インターフェイスを満たすことを確認します:

func (a ModelA) Save() {
   // Save logic for ModelA
}

func (b ModelB) Save() {
   // Save logic for ModelB
}

この構造を配置すると、Savable インターフェイスを介していずれかの構造体のインスタンスを操作できます。

var i Savable
i = SomeMethodThatRetunsMyModel()
i.Save()
SomeOthermMethodThatAcceptsASavableAndCallesSave(i)

埋め込みを使用した実装

あるいは、次のこともできます。また、共通フィールド (Guid) を持つベース ModelC を定義することで埋め込みアプローチを選択することもできます:

type ModelA struct {
   ModelC
   FiledA string
}

type ModelB struct {
   ModelC
   FiledB string
}

type ModelC struct {
   Guid string `orm:"pk"`
}

func (c ModelC) Save() error {
   // Save logic for ModelC
   return nil
}

ただし、このメソッドは ModelC で定義されたフィールドのみを保存することに注意してください。

考慮事項

両方のアプローチの制限に注意することが重要です:

  • 埋め込み型を静的に参照する必要がある場合、埋め込みアプローチは適切ではない可能性があります。
  • インターフェイスのアプローチは柔軟性を高めますが、コードの重複が発生する可能性があります。

最終的に、最適なソリューションはアプリケーションの特定の要件によって異なります。

以上が共有フィールドを持つ異なる Go 構造体に Save メソッドを効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。