设置 Option 对象时不可变 setter 和传统 setter 的区别

在研究了一段时间的开源项目之后,我经常在一个类的设置选项中看到这种模式。(让我们说“不可变方法”)


// 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 {

}

我的问题是:这些方法之间有什么区别,为什么在我读过的许多开源代码中总是首选第一种方法。


湖上湖
浏览 112回答 1
1回答

宝慕林4294392

至少在 Golang 中,getter 的使用是一种反模式。这种期权模式是众所周知的。Setter 和 getter 在 Golang 空间中并不常见。此选项模式有一个不错的好处,您可以将多个选项函数传递给您的构建器或构造函数,然后遍历所有传递的选项以修改此选项类型,就像在您的示例中一样// then. 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}构造函数调用示例:NewObject(optionA, optionB, optionC, optionD)吸气剂和二传手https://golang.org/doc/effective_go.html#Getters你肯定读过有效的围棋指南 -> https://golang.org/doc/effective_go.html
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go