## 构造函数尽量使用Option写法
```golang
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 代表初始化
func NewFoo(id int, options ...FooOption) *Foo {
foo := &Foo{
name: "default",
id: id,
age: 10,
db: nil,
}
for _, option := range options {
option(foo)
}
return foo
}
```
这样以后,我们初始化结构体时,就变成了这个样子:
```golang
// 具体使用NewFoo的函数
func Bar() {
foo := NewFoo(1, WithAge(15), WithName("foo"))
fmt.Println(foo)
}
```
如果后续Foo增加属性,那么我们只需要增加WithXXX的方法就可以了,而NewFoo函数不需要任何变化,扩展性非常好。
这种Option的写法,在很多著名的库中都有用到,比如:gorm、go-redis等,如果需要对一个比较复杂的结构体初始化的时候,这种方法应该是最优的方式了。
Go 代码优化点