ホームページ バックエンド開発 Golang 共有フィールドを持つ構造体に同じメソッドを実装するときにコードの重複を回避するにはどうすればよいですか?

共有フィールドを持つ構造体に同じメソッドを実装するときにコードの重複を回避するにはどうすればよいですか?

Oct 27, 2024 am 02:21 AM

How to Avoid Code Duplication When Implementing Identical Methods on Structs with Shared Fields?

同じフィールドを持つ構造体全体で共通関数を利用するためのベスト プラクティス

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

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

See all articles