同じフィールドを持つ構造体全体で共通関数を利用するためのベスト プラクティス
2 つの構造体が同じフィールドを持つシナリオでは、次のことを防ぐことが望ましいです。これらのフィールドで動作するメソッドを定義するときのコードの重複。
メソッド レシーバーとしてのカスタム タイプ
推奨されるアプローチは、サービスを提供するカスタム タイプ (バージョンなど) を導入することです。メソッドレシーバーとして。すべてのカスタム型をメソッド レシーバーとして利用できるため、この手法を使用すると、複数の構造体に適用できる単一のメソッドを作成できます。
Composition
カスタム型が定義されている場合は、合成を使用して構造体に組み込むことができます。これには、構造体内にカスタム タイプを埋め込むことが含まれ、基本的にネストされた構造を作成します。
例
次のコード スニペットを考えてみましょう:
<code class="go">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 }</code>
ここで、Version タイプはメソッド レシーバーとして機能し、その PrintVersion メソッドは、埋め込まれた Version フィールドにより、Game 構造体と ERP 構造体の両方からアクセスできます。
Usage
埋め込まれた Version フィールドは、他のフィールドと同様に使用および変更できます。
<code class="go">main() { g := Game{ "Fear Effect", false, "Action-Adventure", "1.0.0", } g.PrintVersion() // Version is 1.0.0 e := ERP{ "Logo", true, []string{"ms-sql"}, "2.0.0", } e.PrintVersion() // Version is 2.0.0 }</code>
このアプローチを採用することで、柔軟性と型安全性を維持しながら、重複メソッドに関連するコードの繰り返しが排除されます。
以上が共有フィールドを持つ構造体に同じメソッドを実装するときにコードの重複を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。