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

Mary-Kate Olsen
リリース: 2024-10-26 14:31:02
オリジナル
940 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!