このタスクは、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 パッケージを利用します。
conf := new(Config) // New config *conf = *defConfig // Initialize with defaults err := json.NewDecoder(strings.NewReader(fileContent)).Decode(&conf) if err != nil { panic(err) }
このアプローチには、いくつかの利点があります。
指定されたデフォルト構成とファイルの内容でこのアプローチを使用すると、次の出力が生成されます。
&{S1: S2:file-s2 S3: S4:def S5:file-s5}
これは次のことを示しています。
以上が2 番目の構造体のゼロ以外の値を優先して、2 つの同一の Go 構造体を効率的にマージするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。