Golang: Pattern: Functional Options

 16th September 2022 at 7:27pm

Functional Option 是指在创建对象时(比如 NewXX() 函数),提供一个可变的函数列表参数作为选项。下面给出一个例子:

定义

// options 表示 NewConfigStore 的可选参数。
type options struct {
	appID string
}

// Option 是 NewConfigStore 的函数式参数类型。
type Option func(options *options) error

// WithAppID 设置 NewConfigStore 的 appID 参数。如果没有使用这个参数,NewConfigStore
// 会使用 DefaultAppID() 函数的返回值作为 appID 参数。
func WithAppID(appID string) Option {
	return func(options *options) error {
		if appID == "" {
			return fmt.Errorf("appID is empty")
		}
		options.appID = appID
		return nil
	}
}

func NewConfigStore(opts ...Option) (*ConfigStore, error) {
	var options options
	for _, opt := range opts {
		err := opt(&options)
		if err != nil {
			return nil, err
		}
	}

	// 使用 options 做初始化……
}

使用

// 不需要自定义 appID 时
store := NewConfigStore()

// 需要自定义 appID 时
store := NewConfigStore(WithAppID("my-appid"))