来源于topgoer
函数选项模式
默认值
有时候一个函数会有很多参数,为了方便函数的使用,我们会给希望给一些参数设定默认值,调用时只需要传与默认值不同的参数即可,类似于 python 里面的默认参数和字典参数,虽然 golang 里面既没有默认参数也没有字典参数,但是我们有选项模式。
应用
从这里可以看到,为了实现选项的功能,我们增加了很多的代码,实现成本相对还是较高的,所以实践中需要根据自己的业务场景去权衡是否需要使用。个人总结满足下面条件可以考虑使用选项模式
- 参数确实比较复杂,影响调用方使用
- 参数确实有比较清晰明确的默认值
- 为参数的后续拓展考虑
代码实现
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
42
43
44
45
46
47
|
// @author cold bin
// @date 2023/8/30
package option
const (
DefaultMaxTotal = 10
DefaultMaxIdle = 9
DefaultMinIdle = 1
)
type Pool struct {
name string
maxTotal int
maxIdle int
minIdle int
}
func NewPool(name string, opts ...Option) *Pool {
// 填必须参数
p := &Pool{name: name, maxTotal: DefaultMaxTotal, maxIdle: DefaultMaxIdle, minIdle: DefaultMinIdle}
// 填入选项
for _, opt := range opts {
opt(p)
}
return p
}
type Option func(*Pool)
func WithMaxTotal(maxTotal int) Option {
return func(pool *Pool) {
pool.maxTotal = maxTotal
}
}
func WithMaxIdle(maxIdle int) Option {
return func(pool *Pool) {
pool.maxIdle = maxIdle
}
}
func WithMinIdle(minIdle int) Option {
return func(pool *Pool) {
pool.minIdle = minIdle
}
}
|