--- title: "Go Tricks 2" date: 2022-04-06T11:52:50+07:00 draft: true --- ## Option 模式 1. 不定參數 Golang 中簡單的動態參數實現 ```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 } ``` 2. Option 模式 由不定參數衍生出的 Option 模式,可以實現靈活配置對象,產生更幹淨的代碼,自由的升級。 ```golang // 對象定義 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)前後兼容。