Maison > développement back-end > Golang > Comment puis-je fusionner efficacement deux structures Go du même type ?

Comment puis-je fusionner efficacement deux structures Go du même type ?

Linda Hamilton
Libérer: 2024-12-21 13:56:09
original
857 Les gens l'ont consulté

How Can I Efficiently Merge Two Go Structs of the Same Type?

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

}

retour par défaut
}

  • Il repose sur la réflexion, qui peut être inefficace et sujet aux erreurs.
  • Il suppose que les valeurs nulles sont toujours définies dans la configuration par défaut, ce qui peut ne pas être vrai dans dans tous les cas.
  • Il ne tient pas compte des remplacements explicites par des valeurs nulles dans la configuration du fichier.

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 :

  • Gère les valeurs manquantes avec élégance : Les valeurs manquantes dans la configuration du fichier seront remplies avec les valeurs par défaut.
  • Remplace les valeurs par défaut : Les valeurs fournies dans la configuration du fichier remplaceront les valeurs par défaut, quelle que soit leur tapez.
  • Prend en charge les remplacements explicites des valeurs nulles : Les valeurs explicitement définies sur zéro dans la configuration du fichier remplaceront les valeurs par défaut non nulles.

Pour démontrer cela approche :

  1. Créez une structure de configuration par défaut defConfig avec votre valeur par défaut valeurs.
  2. Chargez les données JSON du fichier dans une variable de chaîne fileContent.
  3. Utilisez json.NewDecoder() pour désorganiser les données JSON dans defConfig.

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

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!

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
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal