Maison > développement back-end > Golang > Comment puis-je fusionner efficacement deux structures Go identiques, en donnant la priorité aux valeurs non nulles de la deuxième structure ?

Comment puis-je fusionner efficacement deux structures Go identiques, en donnant la priorité aux valeurs non nulles de la deuxième structure ?

Mary-Kate Olsen
Libérer: 2024-12-03 16:04:15
original
577 Les gens l'ont consulté

How Can I Efficiently Merge Two Identical Go Structs, Prioritizing Non-Zero Values from the Second Struct?

Fusion des champs de deux structures identiques

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.

Approche basée sur la réflexion

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
 }
Copier après la connexion

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.

JSON Unmarshaling Approche

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(&amp;conf)
if err != nil {
    panic(err)
}
Copier après la connexion

Cette approche offre plusieurs avantages :

  • Elle gère automatiquement les valeurs manquantes et nulles dans le fichier de configuration.
  • Il préserve les remplacements explicites à des valeurs nulles.

Analyse de Résultats

L'utilisation de cette approche avec la configuration par défaut et le contenu du fichier donnés produit le résultat suivant :

&amp;{S1: S2:file-s2 S3: S4:def S5:file-s5}
Copier après la connexion

Cela démontre que :

  • S1, manquant dans le fichier, reste une valeur nulle.
  • S2, spécifié dans le fichier, remplace le zéro par défaut valeur.
  • S3, explicitement défini sur zéro dans le fichier, remplace la valeur par défaut non nulle.
  • S4, absent du fichier, conserve sa valeur par défaut.
  • S5, spécifié dans le fichier, remplace la valeur 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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal