異なるフィールドを持つ構造体に共有機能を効率的に追加するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-19 08:49:02
オリジナル
806 人が閲覧しました

How to Efficiently Add Shared Functionality to Go Structs with Different Fields?

差別化された 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート