Go函数选项模式
type User struct { Id int Name string } type option func(*User) func (u *User) Option(opts ...option) { for _, opt := range opts { opt(u) } } func WithId(id int) option { return func(u *User) { u.Id = id } } func WithName(name string) option { return func(u *User) { u.Name = name } } func main() { u1 := &User{} u1.Option(WithId(1)) fmt.Printf("%+v\n", u1) u2 := &User{} u2.Option(WithId(1), WithName("frank")) fmt.Printf("%+v\n", u2) }
输出结果:
&{Id:1 Name:}
&{Id:1 Name:frank}
阅读上面这段代码,我们可以发现,首先,我们定义一个名字是 option
的类型,它实际上是一个可以接收一个参数的函数。
然后,我们给 User
结构体定义一个 Option
方法,该方法接收我们定义的 option
类型的变长参数,方法体中使用 for-loop
执行函数。
定义 WithId
函数和 WithName
函数,设置 User
结构体的字段 Id
和字段 Name
,该函数通过返回闭包的形式实现。