"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.

Respuestas a la pregunta(3)

Su respuesta a la pregunta