"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo fusionar eficientemente el mismo tipo de estructura GO? Método de codificación JSON

¿Cómo fusionar eficientemente el mismo tipo de estructura GO? Método de codificación JSON

Publicado el 2025-04-16
Navegar:480

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

fusionar campos de estructuras idénticas con JSON Encoding

en el ámbito de la programación GO, la tarea de fusionar campos de dos estructuras del mismo tipo surge con frecuencia. Considere un escenario en el que tiene una configuración predeterminada, como:

type Config struct {
  path string
  id   string
  key  string
  addr string
  size uint64
}

var DefaultConfig = Config{"", "", "", "", 0}

And a configuration loaded from a file, such as:

var FileConfig = Config{"", "file_id", "", "file_addr", 0}

Your objective is to merge these two configurations so that the result possesses Los valores de ambas estructuras, con fileConfig sobrescribiendo cualquier valor en defaultconfig. Sin embargo, FileConFig no puede contener todos los campos.

Originalmente, reflexionó utilizando la reflexión para esta tarea:

func merge(default *Config, file *Config) (*Config) {
  b := reflect.ValueOf(default).Elem()
  o := reflect.ValueOf(file).Elem()

  for i := 0; i  

Sin embargo, en este caso, la reflexión no es una solución óptima. Un enfoque más elegante es aprovechar el poder del paquete de codificación/json.

El paquete de codificación/json proporciona un mecanismo simple para unmarshal JSON datos en una estructura de GO predefinida. Utilizando esta técnica, puede fusionar con elegancia sus configuraciones:

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
}

En esta solución, el fileConFig no está en la configuración predeterminada. El paquete de codificación/JSON maneja todas las complejidades de los valores de campo de configuración, incluidos los valores faltantes (que se predeterminan a su valor cero) y valores especificados por archivos que anulan los valores predeterminados.

mediante la utilización de la unmarshaling, logra una solución simple y eficiente para fusionar las estructuras del mismo tipo, asegurando que fileConfigu se establece que se establece que se establecerá precedentes por valor predeterminado.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3