Go 选项模式:使用闭包实现选项模式

使用闭包实现选项模式:

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 湖北}

}

  

猜你喜欢

转载自www.cnblogs.com/flycc/p/12667932.html