Considérez une structure de configuration avec plusieurs champs. Vous disposez de deux structures de ce type, DefaultConfig avec des valeurs par défaut et FileConfig chargé à partir d'un fichier. L'objectif est de fusionner ces structures, en donnant la priorité aux valeurs dans FileConfig tout en préservant les champs non définis.
Une approche consiste à utiliser la réflexion pour comparer les valeurs des champs et mettre à jour de manière sélective celles dans 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 }
Cependant, cette méthode nécessite une gestion prudente des valeurs nulles, car elle pourrait conduire à des erreurs involontaires. écrase.
Une solution plus élégante et sans effort utilise le package encoding/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) }
Avec cette approche :
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!