ホームページ >バックエンド開発 >Golang >同じタイプの 2 つの Go 構造体を効率的にマージするにはどうすればよいですか?

同じタイプの 2 つの Go 構造体を効率的にマージするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-21 13:56:09819ブラウズ

How Can I Efficiently Merge Two Go Structs of the Same Type?

リフレクションまたは JSON アンマーシャリングを使用した同じ型の構造体のマージ

Go では、2 つの構造体をマージする必要があるシナリオが発生する場合があります。同じ型で、ある構造体の値が別の構造体の値をオーバーライドする可能性があります。この記事では、これを実現する 2 つのアプローチについて説明します。Go のリフレクション機能を使用する方法と、JSON データを準備されたデフォルト構成にアンマーシャリングする方法です。

リフレクション アプローチ (非推奨)

リフレクション アプローチ以下に示すように、オーバーライドするフィールドを決定するためにゼロ値をチェックする必要があります。ただし、この解決策は次の理由から理想的ではありません。

<br>func merge(default <em>Config, file </em>Config) (*Config) {<br> b :=リフレクト。 ValueOf(デフォルト).Elem()<br> o :=反映.ValueOf(file).Elem()</p>
<p>for i := 0;私は< b.NumField(); i {</p>
<pre class="brush:php;toolbar:false">defaultField := b.Field(i)
fileField := o.Field(i)
if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() {
 defaultField.Set(reflect.ValueOf(fileField.Interface()))
}

}

デフォルトを返す
}

  • リフレクションに依存しているため、非効率的になる可能性があります
  • 常にゼロ値が設定されることを前提としています。デフォルト設定は、すべての場合に当てはまらない可能性があります。
  • ファイル設定内のゼロ値への明示的なオーバーライドは考慮されません。

JSON アンマーシャリング アプローチ (推奨) )

よりエレガントで柔軟なアプローチは、Go のエンコーディング/json パッケージを使用し、JSON をアンマーシャルすることです。データを準備されたデフォルト構成に追加します。この方法には、いくつかの利点があります。

  • 欠損値を適切に処理します。 ファイル構成に欠落している値は、デフォルト値で埋められます。
  • デフォルト値をオーバーライドします: ファイル構成で指定された値は、その設定に関係なく、デフォルト値をオーバーライドします。 type.
  • ゼロ値への明示的なオーバーライドをサポートします。 ファイル構成で明示的にゼロに設定された値は、ゼロ以外のデフォルト値をオーバーライドします。

これを実証するにはアプローチ:

  1. デフォルトを使用してデフォルト構成構造体 defConfig を作成します。 value.
  2. JSON データをファイルから文字列変数 fileContent にロードします。
  3. json.NewDecoder() を使用して、JSON データを defConfig にアンマーシャリングします。

コード例:

var defConfig = &Config{
    S1: "",
    S2: "",
    S3: "abc",
    S4: "def",
    S5: "ghi",
}

const fileContent = `{"S2":"file-s2","S3":"","S5":"file-s5"}`

err := json.NewDecoder(strings.NewReader(fileContent)).Decode(defConfig)
if err != nil {
    panic(err)
}

このソリューションでは、デフォルト設定の値がファイル構成内の値によって上書きされ、同じタイプの構造体をマージするための信頼性が高く柔軟な方法が提供されます。

以上が同じタイプの 2 つの Go 構造体を効率的にマージするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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