go的函数式选项模式[Functional Options Pattern in Go]
前言:
go语言开发遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 类似python等语言中的函数默认参数,有些对象应该使用一些基本的默认设置来开箱即用, 你偶尔可能需要提供一些更详细的配置.
那么你如何创建一个函数, 用户可以指定一些额外的配置?
解决方法:函数式选项模式
package main
// 函数式选项模式(灵活使用默认值,又不影响对元素的修改)
//1、定义一个Options函数类型
type Options func(*Option)
//2、利用闭包为每个字段编写一个设置值的With函数:
func WithA(a,b string)Options {
return func(o *Option) {
o.A = a
o.B = b
}
}
func WithC(c int)Options {
return func(o *Option) {
o.C = c
}
}
// 3、我们定义一个默认的Option
var defaultO = &Option{ // 指针消耗少
A: "A",
B: "B",
C: 100,
}
// 创造新的构造函数
func NewOptions(opt ...Options) (o *Option ){
o = defaultO
for _,O :=range opt{
O(o)
}
return o
}
func main() {
o := NewOption("a","b",1)
fmt.Println("o>>:",o)
//
o1 := NewOptions()
fmt.Println("o1:>>",o1)
o2 := NewOptions(WithA("AA","BB"))
fmt.Println("o1:>>",o2)
}
// 输出
o>>: &{a b 1}
o1:>> &{A B 100}
o1:>> &{AA BB 100
总结:
函数式选项模式的本质是利用go对闭包的支持,实现了函数默认值,并且以后再要为Option添加新的字段也不会影响之前的代码。