ホームページ > バックエンド開発 > Golang > 特定の値を優先しながら Go 構造体を効率的にマージするにはどうすればよいですか?

特定の値を優先しながら Go 構造体を効率的にマージするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-29 21:03:10
オリジナル
387 人が閲覧しました

How to Efficiently Merge Go Structs While Prioritizing Specific Values?

構造体フィールドの効率的なマージ

問題

複数のフィールドを持つ Config 構造体を考えてみましょう。このタイプの 2 つの構造体、デフォルト値を持つ DefaultConfig とファイルからロードされた FileConfig があります。目標は、これらの構造体をマージし、未設定のフィールドを保持しながら FileConfig 内の値を優先することです。

リフレクション ベースのソリューション

1 つのアプローチには、リフレクションを使用してフィールド値を比較し、DefaultConfig 内のフィールド値を選択的に更新することが含まれます。 :

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 パッケージを利用します。

import (
  "encoding/json"
  "io/ioutil"
)

var defConfig = &Config{
  S1: "def1",
  S2: "def2",
  S3: "def3",
}

func main() {
  fileContent, err := ioutil.ReadFile("config.json")
  if err != nil {
    panic(err)
  }

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

  fmt.Printf("%+v", defConfig)
}
ログイン後にコピー

このアプローチでは、

  • config.json 内の欠落値はデフォルトを保持します値。
  • config.json 内の値は、ゼロに設定されている場合でも、デフォルト値を上書きします。
  • config.json 内の明示的なゼロ値は、ゼロ以外のデフォルト値を上書きします。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート