Fusion de structures du même type avec réflexion ou démarshalling JSON
Dans Go, vous pouvez rencontrer un scénario dans lequel vous devez fusionner deux structures du même type, les valeurs d'une structure remplaçant potentiellement celles d'une autre. Cet article explore deux approches pour y parvenir : utiliser les capacités de réflexion de Go ou décomposer les données JSON dans une configuration par défaut préparée.
Approche de réflexion (non recommandée)
L'approche de réflexion , comme présenté ci-dessous, nécessite de vérifier les valeurs nulles pour déterminer les champs à remplacer. Cependant, cette solution n'est pas idéale car :
<br>func merge(default <em>Config, file </em>Config) (*Config) {<br> b := réflexion. ValueOf(default).Elem()<br> o := Reflect.ValueOf(file).Elem()</p> <p>for i := 0; je &Lt ; b.NumField(); i {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">defaultField := b.Field(i) fileField := o.Field(i) if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() { defaultField.Set(reflect.ValueOf(fileField.Interface())) }
}
retour par défaut
}
Approche de démarshalling JSON (recommandée)
Une approche plus élégante et flexible consiste à utiliser le package encoding/json de Go et à décomposer les données JSON dans une configuration par défaut préparée. Cette méthode offre plusieurs avantages :
Pour démontrer cela approche :
Exemple de code :
var defConfig = &Config{ S1: "", S2: "", S3: "abc", S4: "def", S5: "ghi", } const fileContent = `{"S2":"file-s2","S3":"","S5":"file-s5"}` err := json.NewDecoder(strings.NewReader(fileContent)).Decode(defConfig) if err != nil { panic(err) }
Cette solution garantit que les valeurs de la configuration par défaut sont écrasées par les valeurs du configuration de fichiers, offrant un moyen fiable et flexible de fusionner des structures du même type.
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!