获取值或默认值

主要观点:

  • Go 1.22 新增的cmp.Or可用于轻松设置默认值,其功能与之前自定义的ValOrDefault相似,应优先使用cmp.Or
  • Go 以往在初始化默认值方面存在不足,如设置无值属性的默认值需多个单独的条件判断,代码较丑且易出错。
  • Go 1.18 的泛型在这方面起到了很大作用,如valutil.ValOrDefault函数可简化代码,还有ValOrDefaultFunc变体可按需延迟生成默认值。

关键信息:

  • 之前设置默认值的代码需多个if条件判断,如对Config结构体中不同属性设置默认值的代码。
  • cmp.Or示例代码:config = &Config{ CancelledJobRetentionPeriod: cmp.Or(config.CancelledJobRetentionPeriod, maintenance.CancelledJobRetentionPeriodDefault), CompletedJobRetentionPeriod: cmp.Or(config.CompletedJobRetentionPeriod, maintenance.CompletedJobRetentionPeriodDefault), DiscardedJobRetentionPeriod: cmp.Or(config.DiscardedJobRetentionPeriod, maintenance.DiscardedJobRetentionPeriodDefault), }
  • ValOrDefault函数代码:func ValOrDefault[T comparable](val, defaultVal T) T { var zero T if val!= zero { return val } return defaultVal }
  • ValOrDefaultFunc函数代码:func ValOrDefaultFunc[T comparable](val T, defaultFunc func() T) T { var zero T if val!= zero { return val } return defaultFunc() }

重要细节:

  • 提到 Go 传统上对 Larry Wall 名言的“扭曲”,强调了在默认值设置方面的问题。
  • 以 Ruby 为例说明其他编程语言在设置默认值方面的简洁性。
  • 介绍了ptrutil.ValOrDefault在配置结构体中的使用,以及ValOrDefaultFuncClientID设置中的应用。还提到ValOrDefault可参考River’s valutil implementation
阅读 19
0 条评论