来源于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
	}
}