package main
import "fmt"
// 函数式选项模式(灵活使用默认值,又不影响对元素的修改)
type Option struct {
A string
B string
C int
}
// 1、定义一个Options函数类型
type Options func(*Option)
// 2、利用闭包为每个字段编写一个设置值的With函数:
func WithA(a, b string) Options {
return func(o *Option) {
o.A = a
o.B = b
}
}
func WithC(c int) Options {
return func(o *Option) {
o.C = c
}
}
// 3、我们定义一个默认的Option
var defaultO = &Option{ // 指针消耗少
A: "A",
B: "B",
C: 100,
}
// 创造新的构造函数
func NewOptions(opt ...Options) (o *Option) {
o = defaultO
for _, O := range opt {
O(o)
}
return o
}
func main() {
o := &Option{"a", "b", 1}
fmt.Println("o>>:", o)
//
o1 := NewOptions()
fmt.Println("o1:>>", o1)
o2 := NewOptions(WithA("AA", "BB"), WithC(1000))
fmt.Println("o1:>>", o2)
}
输出结果如下:
o>>: &{a b 1}
o1:>> &{A B 100}
o1:>> &{AA BB 1000}