【发布时间】:2017-11-20 15:26:18
【问题描述】:
看着这个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
}
这里我不确定:
- 如果需要反思
- 可能有更简单的方法来做到这一点
我在这里看到的另一个问题是检查零值可能很棘手:如果覆盖结构 打算 用零值覆盖怎么办?幸运的是,我认为它不适用于我的情况 - 但这变成了一个函数,以后可能会成为一个问题
【问题讨论】:
-
绕过零值的唯一方法是不要在配置结构中包含原始整数或字符串。或者至少对于默认情况下非零但可以设置为零的值不适用。对于这些,您必须使用
*int等。