设置 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