可选项与闭包结合
var (
DefaultArea = "苏州"
DefaultHigh = uint32(170)
)
type Options struct {
Area string
High uint32
}
type Option interface {
Apply(*Options)
}
type OptionFunc func(*Options)
func (f OptionFunc) Apply(o *Options) {
f(o)
}
func WithArea(area string) Option {
return OptionFunc(func(o *Options) {
o.Area = area
})
}
func WithHigh(high uint32) Option {
return OptionFunc(func(o *Options) {
o.High = high
})
}
type User struct {
Name string
Age uint32
Opts *Options
}
func (u User) String() string {
return fmt.Sprintf("%s,%v岁,身高:%v,住在:%s", u.Name, u.Age, u.Opts.High, u.Opts.Area)
}
func main() {
user1 := NewUser("小红", 16)
user2 := NewUser("小明", 17, WithArea("南京"), WithHigh(10))
fmt.Println(user1)
fmt.Println(user2)
}
func NewUser(name string, age uint32, opts ...Option) *User {
user := &User{}
user.Name = name
user.Age = age
op := &Options{
Area: DefaultArea,
High: DefaultHigh,
}
for _, p := range opts {
p.Apply(op)
}
user.Opts = op
return user
}
网友评论