La tâche consiste à fusionner deux structures du même type de telle sorte que les champs de la deuxième structure remplacent ceux de la première, mais uniquement s'ils sont définis. La solution doit prendre en compte la possibilité de valeurs nulles.
Une première approche envisage d'utiliser la réflexion :
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 }
Cependant, cette approche se heurte à des inquiétudes concernant l'utilisation de la réflexion et la difficulté de vérifier les valeurs nulles dans tous les cas.
Une solution alternative exploite le package encoding/json :
conf := new(Config) // New config *conf = *defConfig // Initialize with defaults err := json.NewDecoder(strings.NewReader(fileContent)).Decode(&conf) if err != nil { panic(err) }
Cette approche offre plusieurs avantages :
L'utilisation de cette approche avec la configuration par défaut et le contenu du fichier donnés produit le résultat suivant :
&{S1: S2:file-s2 S3: S4:def S5:file-s5}
Cela démontre que :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!