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; iSin 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.
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