使用闭包实现选项模式:
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 湖北}
}
原文:https://www.cnblogs.com/flycc/p/12667932.html