考虑一个具有多个字段的 Config 结构体。您有两个这种类型的结构,具有默认值的 DefaultConfig 和从文件加载的 FileConfig。目标是合并这些结构,优先考虑 FileConfig 中的值,同时保留未设置的字段。
一种方法涉及使用反射来比较字段值并有选择地更新 DefaultConfig 中的字段值:
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 }
但是,此方法需要仔细处理零值,因为它可能会导致意外的结果覆盖。
更优雅且零工作量的解决方案利用编码/json 包:
import ( "encoding/json" "io/ioutil" ) var defConfig = &Config{ S1: "def1", S2: "def2", S3: "def3", } func main() { fileContent, err := ioutil.ReadFile("config.json") if err != nil { panic(err) } err = json.NewDecoder(bytes.NewReader(fileContent)).Decode(&defConfig) if err != nil { panic(err) } fmt.Printf("%+v", defConfig) }
使用这种方法:
以上是如何在优先考虑特定值的同时有效地合并 Go 结构?的详细内容。更多信息请关注PHP中文网其他相关文章!