ホームページ >バックエンド開発 >Golang >2 番目の構造体のゼロ以外の値を優先して、2 つの同一の Go 構造体を効率的にマージするにはどうすればよいですか?

2 番目の構造体のゼロ以外の値を優先して、2 つの同一の Go 構造体を効率的にマージするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 16:04:15523ブラウズ

How Can I Efficiently Merge Two Identical Go Structs, Prioritizing Non-Zero Values from the Second Struct?

2 つの同一の構造体のフィールドをマージする

このタスクは、2 番目の構造体のフィールドが最初の構造体のフィールドをオーバーライドするように、同じ型の 2 つの構造体をマージすることです。設定されている場合。解決策では、ゼロ値の可能性を考慮する必要があります。

リフレクション ベースのアプローチ

最初のアプローチでは、リフレクションの使用が検討されます。

func merge(default *Config, file *Config) (*Config) {
  b := reflect.ValueOf(default).Elem()
  o := reflect.ValueOf(file).Elem()

  for i := 0; i < b.NumField(); i++ {
    defaultField := b.Field(i)
    fileField := o.Field(i)
    if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() {
     defaultField.Set(reflect.ValueOf(fileField.Interface()))
    }
  }

  return default
 }

ただし、このアプローチには懸念があります。リフレクションの使用と、すべてのケースでゼロ値をチェックすることの難しさについて。

JSON アンマーシャリングアプローチ

代替ソリューションでは、エンコーディング/json パッケージを利用します。

conf := new(Config) // New config
*conf = *defConfig  // Initialize with defaults

err := json.NewDecoder(strings.NewReader(fileContent)).Decode(&amp;conf)
if err != nil {
    panic(err)
}

このアプローチには、いくつかの利点があります。

  • config ファイル。
  • 明示的なオーバーライドをゼロに保持します。

結果の分析

指定されたデフォルト構成とファイルの内容でこのアプローチを使用すると、次の出力が生成されます。

&amp;{S1: S2:file-s2 S3: S4:def S5:file-s5}

これは次のことを示しています。

  • S1 はファイルに存在せず、ゼロのままですvalue.
  • S2 は、ファイル内で指定され、デフォルトのゼロ値をオーバーライドします。
  • S3 は、ファイル内で明示的にゼロに設定され、デフォルトのゼロ以外の値をオーバーライドします。
  • S4 はファイルに存在せず、デフォルト値が保持されます。
  • S5 はファイルで指定され、デフォルト値をオーバーライドします。値。

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

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