Problème : Étant donné deux structures dont les champs peuvent se chevaucher, comment peut-on les fusionner, en donnant la priorité aux champs du deuxième structure sur la première ?
Dans l'exemple fourni, la structure Config comporte plusieurs champs. Le but est de combiner deux instances de cette structure (DefaultConfig et FileConfig), FileConfig étant prioritaire. Cependant, FileConfig peut avoir des champs manquants.
Approche de réflexion :
L'extrait de code fourni utilise la réflexion pour vérifier si la valeur d'un champ dans FileConfig n'est pas la valeur par défaut pour son type. . Si tel est le cas, il définit le champ dans DefaultConfig sur la valeur FileConfig.
Approche simplifiée basée sur JSON :
Une approche alternative et efficace consiste à utiliser l'encodage/json package pour décoder le contenu de FileConfig dans une copie de DefaultConfig. Cette méthode offre plusieurs avantages :
Mise en œuvre :
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 }
Utilisation :
// 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)
Sortie :
&{S1: S2:file-s2 S3: S4:def S5:file-s5}
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!