首页 > 后端开发 > Golang > 如何有效地合并两个相同的 Go 结构,并优先考虑第二个结构中的非零值?

如何有效地合并两个相同的 Go 结构,并优先考虑第二个结构中的非零值?

Mary-Kate Olsen
发布: 2024-12-03 16:04:15
原创
576 人浏览过

How Can I Efficiently Merge Two Identical Go Structs, Prioritizing Non-Zero Values from the Second Struct?

合并两个相同结构的字段

任务是合并两个相同类型的结构,使得第二个结构中的字段覆盖第一个结构中的字段,但仅如果它们已设置。该解决方案应考虑零值的可能性。

基于反射的方法

最初的方法考虑使用反射:

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 解组方法

另一种解决方案利用encoding/json包:

conf := new(Config) // New config
*conf = *defConfig  // Initialize with defaults

err := json.NewDecoder(strings.NewReader(fileContent)).Decode(&amp;conf)
if err != nil {
    panic(err)
}
登录后复制

这种方法有几个优点:

  • 它自动处理缺失值和零值配置文件。
  • 它将显式覆盖保留为零

结果分析

在给定的默认配置和文件内容中使用此方法会产生以下输出:

&amp;{S1: S2:file-s2 S3: S4:def S5:file-s5}
登录后复制

这表明:

  • S1,从文件中丢失,仍然为零值。
  • S2,在文件中指定,覆盖默认零值。
  • S3,在文件中显式设置为零,覆盖默认非零值。
  • S4,文件中缺失,保留其默认值。
  • S5,文件中指定,覆盖默认值值。

以上是如何有效地合并两个相同的 Go 结构,并优先考虑第二个结构中的非零值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板