「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 共有フィールドを使用して同様の Go 構造体の関数を管理するにはどうすればよいですか?

共有フィールドを使用して同様の Go 構造体の関数を管理するにはどうすればよいですか?

2024 年 11 月 8 日に公開
ブラウズ:695

How to Manage Functions for Similar Go Structs with Shared Fields?

Go のベスト プラクティス: 共有フィールドを持つ類似の構造体の関数の管理

Go では、類似したフィールドを持つ複数の構造体に遭遇するのが一般的です。それらに対して同じ操作を実行する必要があります。柔軟性を維持しながらコードの繰り返しを回避するには、次の戦略を検討してください:

共有フィールドのカスタム タイプの作成:

共有フィールドが単純なデータ型の場合 (例: string)、そのカスタム タイプを定義することを検討してください。これにより、カスタム型にメソッドをアタッチできるようになり、その型を埋め込む任意の構造体で使用できるようになります。

type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}

次に、バージョン タイプを構造体に埋め込みます。

type Game struct {
    Name               string
    MultiplayerSupport bool
    Genre              string
    Version
}

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}

これにより、Version フィールドの PrintVersion メソッドを使用してバージョンを印刷できるようになります:

g.PrintVersion()
e.PrintVersion()

リフレクションの使用:

共有フィールドに異なるタイプを使用できる場合、またはより柔軟性が必要な場合は、リフレクションを使用して適切なフィールドを動的に呼び出すことができます。方法。このアプローチはより複雑で、パフォーマンスに多少の影響を及ぼしますが、柔軟性が高まります。

type Printer interface {
    PrintVersion() error
}

func PrintVersion(p Printer) error {
    t := reflect.TypeOf(p)
    method, ok := t.MethodByName("PrintVersion")
    if !ok {
        return fmt.Errorf("object doesn't have a PrintVersion method")
    }

    return method.Func.Call([]reflect.Value{reflect.ValueOf(p)})[0].Interface().(error)
}

その後、PrintVersion 関数を使用して、Printer インターフェイスを実装する任意のオブジェクトで PrintVersion メソッドを呼び出すことができます。

var game Game
var erp ERP

PrintVersion(game)
PrintVersion(erp)
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3