为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
湖上湖 2022-05-05 17:57:50
在研究了一段时间的开源项目之后,我经常在一个类的设置选项中看到这种模式。(让我们说“不可变方法”)// 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


查看完整回答
反对 回复 2022-05-05
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信