什么是functional option模式
当我们遇到一定要初始化一个类的时候,大部分时候,我们都会使用类似下列的 New 方法:
package newdemo
type Foo struct {
name string
id int
age int
db interface{
}
}
func NewFoo(name string, id int, age int, db interface{
}) *Foo {
return &Foo{
name: name,
id: id,
age: age,
db: db,
}
}
在这段代码中,我们定义一个 NewFoo 方法,其中存放初始化 Foo 结构所需要的各种字段属性。
如果你觉得这个写法ok,那请你思考一下几个问题:
- 当参数变多,比如超过5个
- 调用者希望更加灵活易用,比如这么多字段能不能给默认值,并能根据自己的需求自行设置部分字段
如何满足呢?这时就该今天的主角出场了-- funtion optional模式。
funtion optional写法,顾名思义,就是将所有可选的参数作为一个可选方式,一般我们会设计一个“函数类型”来代表这个 Option,然后配套将所有可选字段设计为一个这个函数类型的具体实现。在具体的使用的时候,使用可变字段的方式来控制有多少个函数类型会被执行。比如上述的代码,我们会改造为:
type Foo struct {
name string
id int
age int
db interface{
}
}
// FooOption 代表可选参数
type FooOption func(foo *Foo)
// WithName 代表Name为可选参数
func WithName(name string) FooOption {
return func(foo *Foo) {
foo.name = name
}
}
// WithAge 代表age为可选参数
func WithAge(age int) FooOption {
return func(foo *Foo) {
foo.age = age
}
}
// WithDB 代表db为可选参数
func WithDB(db interface{
}) FooOption {
return func(foo *Foo) {
foo.db = db
}
}
// NewFoo 代表初始化