複数のフィールドを持つ 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 パッケージを利用します。
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) }
このアプローチでは、
以上が特定の値を優先しながら Go 構造体を効率的にマージするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。