"Fusionar" coloca dos estructuras del mismo tipo
Mirando estostruct
:
type Config struct {
path string
id string
key string
addr string
size uint64
}
Ahora tengo unDefaultConfig
Inicializado con algunos valores y uno cargado desde un archivo, digamosFileConfig
. Quiero que ambas estructuras se fusionen para que obtenga unConfig
con el contenido de ambas estructuras.FileConfig
debería anular todo lo establecido enDefaultConfig
, mientrasFileConfig
puede no tener todos los campos establecidos. (¿Por qué esto? Debido a que un usuario potencial puede no conocer el valor predeterminado, por lo que eliminar esa entrada sería equivalente a establecer el valor predeterminado, creo)
Pensé que necesitaría una reflexión para esto:
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
}
Aquí no estoy seguro:
Si se necesita reflexión algunaPuede haber formas más fáciles de hacer esto.Otro problema que veo aquí es que verificar los valores cero puede ser complicado: ¿qué pasa si la estructura superiortiene la intención anular con un valor cero? Afortunadamente, no creo que se aplique a mi caso, pero esto se convierte en una función, puede convertirse en un problema más adelante.