Maison > développement back-end > Golang > Comment fusionner efficacement des structures Go tout en priorisant des valeurs spécifiques ?

Comment fusionner efficacement des structures Go tout en priorisant des valeurs spécifiques ?

Barbara Streisand
Libérer: 2024-11-29 21:03:10
original
408 Les gens l'ont consulté

How to Efficiently Merge Go Structs While Prioritizing Specific Values?

Fusionner efficacement les champs de structure

Problème

Considérez une structure de configuration avec plusieurs champs. Vous disposez de deux structures de ce type, DefaultConfig avec des valeurs par défaut et FileConfig chargé à partir d'un fichier. L'objectif est de fusionner ces structures, en donnant la priorité aux valeurs dans FileConfig tout en préservant les champs non définis.

Solution basée sur la réflexion

Une approche consiste à utiliser la réflexion pour comparer les valeurs des champs et mettre à jour de manière sélective celles dans DefaultConfig. :

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 méthode nécessite une gestion prudente des valeurs nulles, car elle pourrait conduire à des erreurs involontaires. écrase.

Solution basée sur l'encodage/JSON

Une solution plus élégante et sans effort utilise le package encoding/json :

import (
  "encoding/json"
  "io/ioutil"
)

var defConfig = &Config{
  S1: "def1",
  S2: "def2",
  S3: "def3",
}

func main() {
  fileContent, err := ioutil.ReadFile("config.json")
  if err != nil {
    panic(err)
  }

  err = json.NewDecoder(bytes.NewReader(fileContent)).Decode(&defConfig)
  if err != nil {
    panic(err)
  }

  fmt.Printf("%+v", defConfig)
}
Copier après la connexion

Avec cette approche :

  • Les valeurs manquantes dans config.json conserveront la valeur par défaut valeurs.
  • Les valeurs dans config.json remplaceront les valeurs par défaut, même si elles sont définies sur zéro.
  • Les valeurs nulles explicites dans config.json écraseront les valeurs par défaut non nulles.

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