本文通过案例介绍【函数式选项设计模式】
package main
import "fmt"
type Student struct {
name_ string
age_ int
}
// 编写: 传统的构造函数
func newStudent1(name string, age int) *Student {
return &Student{
name_: name,
age_: age,
}
}
/**** 下面介绍新版构造函数的写法 ****/
/* 解决2个问题:
1. 为Student的字段指定默认值
2. Student的字段成员可能会发生变更
*/
/* 1. 定义一个函数类型 */
type StudentOptFunc func(*Student)
// 2. 然后利用闭包为“每个成员属性”编写一个设置值的With函数
func WithName(name string) StudentOptFunc {
return func(o *Student) {
o.name_ = name
}
}
func WithAge(age int) StudentOptFunc {
return func(o *Student) {
o.age_ = age
}
}
// 全局变量
var (
defaultStudent = &Student{
name_: "James",
age_: 18,
}
)
// 编写: 新版的构造函数
/*
*@param [in] funcs 函数集合(修改每个成员属性的值)
*@return 修改后的defaultStudent
*/
func newStudent2(funcs ...StudentOptFunc) *Student {
s := defaultStudent // 取出默认的全局变量, 保存到s
for _, f := range funcs {
f(s)
}
return s
}
func main() {
// 旧版构造函数
x := newStudent1("Kobe", 10)
fmt.Println(x)
// 新版构造函数:使用默认值
x = newStudent2()
fmt.Println(x)
// 新版构造函数:使用指定值
x = newStudent2(
WithName("沙河娜扎"),
WithAge(20),
)
fmt.Println(x)
}
执行结果:
C:\Users\Sangfor\go\src\awesomeProject>test.exe
&{Kobe 10}
&{James 18}
&{沙河娜扎 20}