设置 Option 对象时不可变 setter 和传统 setter 之间的区别
Differences between the immutable setter and traditional setter while set up an Option object
在调查开源项目一段时间后,我经常在 class 的设置选项中看到该模式。 (假设 "immutable method")
// 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 {
}
我的问题是:这些方法之间有什么区别,为什么第一种方法在我阅读的许多开源中总是更受欢迎。
注意:这里有一些开源代码,其中包含实现上述模式的行。这些开源是由 Google 发起的,所以也许这种模式仅特定于 Google。
谢谢
至少在 Golang 中,getter 的使用是一种反模式。这种期权模式是众所周知的。 Setter 和 getter 在 Golang 中不是很常见 space.
这个选项模式有一个小好处,你可以将多个选项函数传递到你的构建器或构造函数中,然后迭代所有传递的选项来修改这个选项类型,就像你的例子
// 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
您肯定阅读了有效的 go 指南 -> https://golang.org/doc/effective_go.html
在调查开源项目一段时间后,我经常在 class 的设置选项中看到该模式。 (假设 "immutable method")
// 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 {
}
我的问题是:这些方法之间有什么区别,为什么第一种方法在我阅读的许多开源中总是更受欢迎。
注意:这里有一些开源代码,其中包含实现上述模式的行。这些开源是由 Google 发起的,所以也许这种模式仅特定于 Google。
谢谢
至少在 Golang 中,getter 的使用是一种反模式。这种期权模式是众所周知的。 Setter 和 getter 在 Golang 中不是很常见 space.
这个选项模式有一个小好处,你可以将多个选项函数传递到你的构建器或构造函数中,然后迭代所有传递的选项来修改这个选项类型,就像你的例子
// 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
您肯定阅读了有效的 go 指南 -> https://golang.org/doc/effective_go.html