Fusionner les champs de structures identiques avec l'encodage JSON
Dans le domaine de la programmation Go, la tâche de fusionner les champs de deux structures identiques le type apparaît fréquemment. Considérons un scénario où vous avez une configuration par défaut, telle que :
type Config struct { path string id string key string addr string size uint64 } var DefaultConfig = Config{"", "", "", "", 0}
Et une configuration chargée à partir d'un fichier, telle que :
var FileConfig = Config{"", "file_id", "", "file_addr", 0}
Votre objectif est de fusionner ces deux configurations afin que le résultat possède les valeurs des deux structures, FileConfig écrasant toutes les valeurs dans DefaultConfig. Cependant, FileConfig peut ne pas contenir tous les champs.
À l'origine, vous avez réfléchi à l'utilisation de la réflexion pour cette tâche :
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, dans ce cas, la réflexion n'est pas une solution optimale. Une approche plus élégante consiste à exploiter la puissance du package encoding/json.
Le package encoding/json fournit un mécanisme simple pour regrouper les données JSON dans une structure Go prédéfinie. En utilisant cette technique, vous pouvez fusionner élégamment vos configurations :
import ( "encoding/json" "strings" ) const fileContent = `{"id":"file_id","addr":"file_addr","size":100}` func unmarshalConfig(conf *Config, content string) error { return json.NewDecoder(strings.NewReader(content)).Decode(conf) } func mergeConfigs(defConfig *Config, fileConfig *Config) error { if err := unmarshalConfig(defConfig, fileContent); err != nil { return err } for _, v := range fileConfig { defConfig[v.key] = v.value } return nil }
Dans cette solution, le fileConfig n'est pas marshalé dans la configuration par défaut. Le package encoding/json gère toutes les complexités liées à la définition des valeurs de champ, y compris les valeurs manquantes (qui prendront par défaut leur valeur zéro) et les valeurs spécifiées par le fichier qui remplacent les valeurs par défaut.
En utilisant le démarshaling, vous obtenez un résultat simple. et efficace pour fusionner des structures du même type, garantissant que les champs FileConfig définis auront priorité sur les valeurs par défaut.
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!