看看这struct
个:
type Config struct {
path string
id string
key string
addr string
size uint64
}
现在我有一个用一些值初始化的DefaultConfig
和一个从文件加载的值,比方说FileConfig
.
我希望将这两个 struct 合并,这样我就可以得到包含两个 struct 内容的Config
.FileConfig
应覆盖在DefaultConfig
中设置的任何内容,而FileConfig
may not have all fields set.
(为什么是这个?因为潜在用户可能不知道默认值,所以删除该条目相当于设置默认值-我认为)
我想我需要反省一下:
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
}
在这里我不太确定:
- 如果完全需要反射
- 也许有更简单的方法可以做到这一点.
我在这里看到的另一个问题是,判断零值可能很棘手:如果要用零值覆盖覆盖 struct intends怎么办?幸运的是,我不认为它适用于我的情况-但这变成了一个函数,它可能以后会成为一个问题