問題: フィールドが重複する可能性がある 2 つの構造体がある場合、フィールドの優先順位を付けてそれらをマージするにはどうすればよいでしょうか。 2 番目の構造体を最初の構造体の上に置きます?
提供された例では、Config 構造体にはいくつかのフィールドがあります。目標は、FileConfig を優先して、この構造体の 2 つのインスタンス (DefaultConfig と FileConfig) を結合することです。ただし、FileConfig にはフィールドが欠落している可能性があります。
リフレクション アプローチ:
提供されたコード スニペットは、リフレクションを使用して、FileConfig のフィールドの値がその型のデフォルトでないかどうかを確認します。 。その場合、DefaultConfig のフィールドが FileConfig 値に設定されます。
簡略化された JSON ベースのアプローチ:
代替の効率的なアプローチは、エンコーディング/json を使用することです。パッケージを使用して、FileConfig の内容を DefaultConfig のコピーにデコードします。この方法にはいくつかの利点があります。
実装:
import ( "encoding/json" ) type Config struct { S1 string S2 string S3 string S4 string S5 string } func MergeConfig(defaultConfig, fileConfig *Config) *Config { // Make a copy of the default configuration mergedConfig := &Config{*defaultConfig} // Unmarshal the file configuration into the merged configuration if err := json.Unmarshal([]byte(fileConfig), mergedConfig); err != nil { // Handle error } return mergedConfig }
使用法:
// Load the configuration from a file fileContent := `{"S2":"file-s2","S3":"","S5":"file-s5"}` fileConfig := &Config{} if err := json.NewDecoder(strings.NewReader(fileContent)).Decode(fileConfig); err != nil { // Handle error } // Initialize the default configuration defConfig := &Config{ S1: "", S2: "", S3: "abc", S4: "def", S5: "ghi", } // Merge the configurations mergedConfig := MergeConfig(defConfig, fileConfig) fmt.Println(mergedConfig)
出力:
&{S1: S2:file-s2 S3: S4:def S5:file-s5}
以上が1 つの構造体の値を優先して、重複するフィールドを持つ 2 つの構造体を効率的にマージするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。