Bootstrap

golang函数参数默认值

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,无

;