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,该函数通过返回闭包的形式实现。
浙公网安备 33010602011771号