1,参考资料:Functional Options in Go: Implementing the Options Pattern in Golang
2,例子:求a,b,c的和
// go 函数参数没有默认值的语法,那我此时想给b添加默认值该怎么办?
func sum(a int, b int, c int) int {
return a + b + c
}
// 还有很多方法可以做到,但是我还是喜欢这种
// 定义包含全部参数的 struct
type Params struct {
a int
b int
c int
}
// 定义一个函数签名
type ParamsOption func(*Params)
// 针对每个成员实现上面的签名
func WithA(a int) ParamsOption {
return func(Params *Params) {
Params.a = a
}
}
func WithB(b int) ParamsOption {
return func(Params *Params) {
Params.b = b
}
}
func WithC(c int) ParamsOption {
return func(Params *Params) {
Params.c = c
}
}
// 很多开源项目用的都是此类方式。。。
// 构造 参数结构体 Params
func NewParams(options ...ParamsOption) *Params {
// 这里就是默认值了
const (
a = 0
b = 0
c = 0
)
x := &Params{
a: a,
b: b,
c: c,
}
for _, o := range options {
o(x) // 这里就是在改你的默认值了
}
return x
}
// 那要怎么使用?
// 先改一下例子吧
func sum(params *Params) int {
return params.a + params.b + params.c
}
// 然后可以这么用
// 你传递哪个With函数就会修改哪个默认值执行操作
Sum := sum(
NewParams(
WithA(1),
WithB(2),
WithC(3),
)
)
// 结束了
3,无