Go语言没有提供默认参数,一旦一个对象有很多属性(这些属性都可以有默认值)的时候,生成一个对象会变得及其麻烦。函数式选项模式可轻松解决该类问题。
package main import "fmt" type Connection struct{} type stuffClient struct { conn Connection timeout int retries int } var defaultStuffClient = stuffClient{ retries: 3, timeout: 2, } type StuffClientOption func(*stuffClient) type StuffClient interface { DoStuff() error } func (c stuffClient) DoStuff() error { return nil } func WithRetries(r int) StuffClientOption { return func(o *stuffClient) { o.retries = r } } func WithTimeout(t int) StuffClientOption { return func(o *stuffClient) { o.timeout = t } } func NewStuffClient(conn Connection, opts ...StuffClientOption) StuffClient { client := defaultStuffClient for _, o := range opts { o(&client) } client.conn = conn return client } func main() { conn := Connection{}; client := NewStuffClient(conn,WithRetries(99),WithTimeout(88)); fmt.Printf("%+v \n",client) }