在研究了一段时间的开源项目之后,我经常在一个类的设置选项中看到这种模式。(让我们说“不可变方法”)
// list of possible options
type Options struct {
Sampler sampler
SpanKind int
}
// define an apply function. which will be called when really initialize an object
type Option func(*Options)
// for each option. Return an function to apply that specific option
func 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 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
}
与上述方法相比,还有另一种使用简单 getter/setter 的方法。
func (o *Options) SetSpanKind(kind int) {
o.spanKind = kind
}
// then. we we build a new object by using directly the Options object
func NewObject(option Options) Object {
}
我的问题是:这些方法之间有什么区别,为什么在我读过的许多开源代码中总是首选第一种方法。
宝慕林4294392
相关分类