Maison > développement back-end > Golang > Comment puis-je fusionner efficacement des structures Go du même type à l'aide de l'encodage JSON ?

Comment puis-je fusionner efficacement des structures Go du même type à l'aide de l'encodage JSON ?

Patricia Arquette
Libérer: 2024-11-28 08:50:10
original
689 Les gens l'ont consulté

How Can I Efficiently Merge Go Structs of the Same Type Using JSON Encoding?

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

Et une configuration chargée à partir d'un fichier, telle que :

var FileConfig = Config{"", "file_id", "", "file_addr", 0}
Copier après la connexion

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

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

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!

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