Go のベスト プラクティス: 共有フィールドを使用した類似の構造体の関数の管理
Go では、類似したフィールドを持つ複数の構造体が発生するのが一般的です。それらに対して同じ操作を実行する必要があります。柔軟性を維持しながらコードの繰り返しを回避するには、次の戦略を検討してください:
共有フィールドのカスタム タイプの作成:
共有フィールドが単純なデータ型の場合 (例: string)、そのカスタム タイプを定義することを検討してください。これにより、カスタム型にメソッドをアタッチできるようになり、その型を埋め込む任意の構造体で使用できるようになります。
<code class="go">type Version string func (v Version) PrintVersion() { fmt.Println("Version is", v) }</code>
次に、Version 型を構造体に埋め込みます。
<code class="go">type Game struct { Name string MultiplayerSupport bool Genre string Version } type ERP struct { Name string MRPSupport bool SupportedDatabases []string Version }</code>
これにより、Version フィールドの PrintVersion メソッドを使用してバージョンを印刷できます:
<code class="go">g.PrintVersion() e.PrintVersion()</code>
Reflection の使用:
共有フィールドが異なるタイプである場合または、さらに柔軟性が必要な場合は、リフレクションを使用して適切なメソッドを動的に呼び出すことができます。このアプローチはより複雑で、パフォーマンスに多少の影響がありますが、より高い柔軟性が得られます。
<code class="go">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) }</code>
その後、PrintVersion 関数を使用して、Printer インターフェイスを実装する任意のオブジェクトで PrintVersion メソッドを呼び出すことができます。
<code class="go">var game Game var erp ERP PrintVersion(game) PrintVersion(erp)</code>
以上が共有フィールドを使用して同様の Go 構造体の関数を管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。