option设计模式
# 函数式选项设计模式
1. 将参数抽离到option,通过with的形式按需扩展修改(这儿相当于java的函数重载)
2. 接口版本(如果参数过多,则应该使用接口版本apply,golang grpc库用了该模式)
1
2
2
# 普通版本
package main
type Option func(*Options)
type Options struct {
name string
age int
}
func WithAge(age int) Option {
// 外部传入修改
return func(o *Options) {
// 这儿相当于更新了Options 将传入的重新复制对age
println(o.name, o.age)
o.age = age
}
}
func NewOptions(opts ...Option) *Options {
o := &Options{
name: "gage",
}
for _, opt := range opts {
opt(o)
}
// 值传递
println("modify:", o.age)
return o
}
func testOption() {
// https://www.liwenzhou.com/posts/Go/functional-options-pattern/
opt := NewOptions(WithAge(29))
println(opt.age, opt.name)
age := WithAge(29)
age(&Options{
name: "gage",
})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 接口版本
1
# 参考
上次更新: 2023-09-18 14:12:21