リフレクションまたは 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 をアンマーシャルすることです。データを準備されたデフォルト構成に追加します。この方法には、いくつかの利点があります。
これを実証するにはアプローチ:
コード例:
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 サイトの他の関連記事を参照してください。