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 }