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
Mary-Kate Olsenoriginal
2024-12-03 16:04:15608parcourir

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
 }

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)
}

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}

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!

Déclaration:
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