ホームページ  >  記事  >  バックエンド開発  >  Go のメソッド レシーバーは、同様の構造体の関数の冗長性をどのように排除できますか?

Go のメソッド レシーバーは、同様の構造体の関数の冗長性をどのように排除できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-26 14:31:02931ブラウズ

How Can Method Receivers in Go Eliminate Function Redundancy for Similar Structs?

関数の冗長性を避けるために 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。