在研究了一段时间的开源项目之后,我经常在一个类的设置选项中看到这种模式。(让我们说“不可变方法”)// list of possible optionstype Options struct { Sampler sampler SpanKind int}// define an apply function. which will be called when really initialize an objecttype Option func(*Options)// for each option. Return an function to apply that specific optionfunc WithSpanKind(spanKind int) Option { return func(o *Options) { o.SpanKind = spanKind }}// then. we we build a new object, we just need to receive a list of optionfunc NewObject(options ...Option) Object { final := &Options{} // then apply each option to options for _, option := range options { option(final) } // then build an object based on the final object}与上述方法相比,还有另一种使用简单 getter/setter 的方法。func (o *Options) SetSpanKind(kind int) { o.spanKind = kind}// then. we we build a new object by using directly the Options objectfunc NewObject(option Options) Object {}我的问题是:这些方法之间有什么区别,为什么在我读过的许多开源代码中总是首选第一种方法。
1 回答
宝慕林4294392
TA贡献2021条经验 获得超8个赞
至少在 Golang 中,getter 的使用是一种反模式。这种期权模式是众所周知的。Setter 和 getter 在 Golang 空间中并不常见。
此选项模式有一个不错的好处,您可以将多个选项函数传递给您的构建器或构造函数,然后遍历所有传递的选项以修改此选项类型,就像在您的示例中一样
// then. we build a new object, we just need to receive a list of option
func NewObject(options ...Option) Object {
final := &Options{}
// then apply each option to options
for _, option := range options {
option(final)
}
// then build an object based on the final object
}
构造函数调用示例:
NewObject(optionA, optionB, optionC, optionD)
吸气剂和二传手
https://golang.org/doc/effective_go.html#Getters
你肯定读过有效的围棋指南 -> https://golang.org/doc/effective_go.html
- 1 回答
- 0 关注
- 111 浏览
添加回答
举报
0/150
提交
取消