На самом деле, мне может понадобиться сделать это .... см. Комментарий в ответе @icza ....
я на этоstruct
:
type Config struct {
path string
id string
key string
addr string
size uint64
}
Теперь у меня естьDefaultConfig
инициализирован с некоторыми значениями и одним загруженным из файла, скажемFileConfig
, Я хочу, чтобы обе структуры объединились, чтобы яConfig
с содержанием обеих структур.FileConfig
следует переопределить все, что установлено вDefaultConfig
, покаFileConfig
может быть не все поля установлены, (Почему это? Потому что потенциальный пользователь может не знать значение по умолчанию, поэтому удаление этой записи будет эквивалентно установке по умолчанию - я думаю)
Я думал, что мне нужно отражение для этого:
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
}
Здесь я не уверен:
Если рефлексия нужна вообщеТам могут быть более простые способы сделать этоДругая проблема, которую я вижу здесь, заключается в том, что проверка на нулевые значения может быть сложной: что, если переопределяющая структуранамеревается переопределить с нулевым значением? К счастью, я не думаю, что это применимо к моему делу - но это становится функцией, это может стать проблемой позже