go-tricks-2.md 1.4 KB


title: "Go Tricks 2" date: 2022-04-06T11:52:50+07:00

draft: true

Option 模式

  1. 不定參數

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
}
  1. Option 模式

由不定參數衍生出的 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)前後兼容。