主要观点:
- 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
在配置结构体中的使用,以及ValOrDefaultFunc
在ClientID
设置中的应用。还提到ValOrDefault
可参考River’svalutil
implementation。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。