使用闭包实现选项模式:
package main import "fmt" //先定义一个结构体 type Stu struct { Name string Age int Addr string } var ( //设置Stu属性的默认值 DefaultStu = &Stu{ Name: "someone", Age: 0, Addr: "unknown", } ) //使用闭包设置Stu的属性 func SetName(name string) func(*Stu) { return func(stu *Stu) { stu.Name = name } } func SetAge(age int) func(*Stu) { return func(stu *Stu) { stu.Age = age } } func SetAddr(addr string) func(*Stu) { return func(stu *Stu) { stu.Addr = addr } } type OptFunc func(*Stu) //参数为SetXXX,因为闭包返回一个函数, //然后再将stu的实例当做参数传入,完美的实现了该实例的属性的设置 func NewStu(opts ...OptFunc) *Stu { stu := DefaultStu for _, o := range opts { o(stu) } return stu } func main() { stu := NewStu() fmt.Println(stu) //&{someone 0 unknown} stu2 := NewStu(SetAddr("湖北"), SetName("波波")) fmt.Println("stu2 =", stu2) //stu2 = &{波波 0 湖北} }