関数の冗長性を避けるために Go のメソッド レシーバーを使用する
Go では、複数の構造体が同様のフィールド名と操作を共有する状況がよく発生します。これらの構造体の関数を定義するときにコードの繰り返しを避けるには、メソッド レシーバーの利用を検討してください。
名前とバージョンを含むフィールドを持つ、Game と ERP という 2 つの構造体があると想像してください。各構造体の Version 変数を出力する関数を作成したいと考えています。
従来は、ゲームと ERP に個別の関数を定義する必要がありました。
<code class="go">type Game struct { Name string MultiplayerSupport bool Genre string Version string } type ERP struct { Name string MRPSupport bool SupportedDatabases []string Version string } func (g *Game) PrintVersion() { fmt.Println("Game Version:", g.Version) } func (e *ERP) PrintVersion() { fmt.Println("ERP Version:", e.Version) }</code>
ただし、このアプローチではコードが導入されます。複製。これを克服するために、Go はメソッド レシーバーを提供します。これを実装する方法は次のとおりです:
<code class="go">type Version string func (v Version) PrintVersion() { fmt.Println("Version:", v) } 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">func main() { g := Game{ "Fear Effect", false, "Action-Adventure", "1.0.0", } g.Version.PrintVersion() e := ERP{ "Logo", true, []string{"ms-sql"}, "2.0.0", } e.Version.PrintVersion() }</code>
Thisこのアプローチにより、関数の冗長性が回避されるだけでなく、複数の構造体にわたって Version フィールドにアクセスするための一貫したインターフェイスを維持することもできます。
以上がGo のメソッド レシーバーは、同様の構造体の関数の冗長性をどのように排除できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。