title: "Go Tricks 2" date: 2022-04-06T11:52:50+07:00
Golang 中簡單的動態參數實現
func Foo(name string, limits... int) {
// default options
page, size := 1, 20
// dynamic
if len(limits) > 1 {
page = limits[0]
size = limits[1]
} else if len(limits) > 0 {
page = limits[0]
}
// go on
}
由不定參數衍生出的 Option 模式,可以實現靈活配置對象,產生更幹淨的代碼,自由的升級。
// 對象定義
type HTTPClient struct {
version string
timeout int
headers map[string]string
}
// 針對對象的可選項定義
type HTTPClientOption func(hc *HTTPClient)
// 可選項配置函數
func WithTimeout(timeout int) HTTPClientOption {
return func(hc *HTTPClient) {
ht.timeout = timeout
}
}
func WithDefaultHeaders(headers map[string][string]) HTTPClientOption {
return func(hc *HTTPClient) {
hc.headers = headers
}
}
// 對象初始化函數
// 參數包含必選項和可選項
func NewHttpClient(version string, options... HTTPClientOption) *HTTPClient {
c := &HTTPClient{
version: version,
}
for _, option := range options {
option(c)
}
return c
}
Option 模式使得對象(本例中的 HTTPClient)在增刪字段(升級)時,保持初始化接口(NewHTTPClient)前後兼容。