本文主要介紹了go語言中函式式選項模式及該設計模式在實際程式設計中的應用。
最近看go-micro/options.go原始碼的時候,發現了一段關於服務註冊的**如下:
type options struct
func
newoptions
(opts ...option) options
for_
, o :=
range opts
return opt
}
可能大家看到現在也不是很明白我說的問題到底是什麼,我把它簡單提煉一下。
我們現在有乙個結構體,定義如下:
type option struct
現在我們需要為其編寫乙個建構函式,我們可能會寫成下面這種方式:
func
newoption
(a, b string
, c int
)*option
}
上面的**很好理解,也是我們一直在寫的。有什麼問題嗎?
我們現在來思考以下兩個問題:
我們可能需要為option的字段指定預設值
option的字段成員可能會發生變更
我們先定義乙個optionfunc
的函式型別
type optionfunc func
(*option)
然後利用閉包為每個字段編寫乙個設定值的with函式:
func
witha
(a string
) optionfunc
}func
withb
(b string
) optionfunc
}func
withc
(c int
) optionfunc
}
然後,我們定義乙個預設的option
如下:
var
( defaultoption =
&option
)
最後編寫我們新版的建構函式如下:
func
newoption2
(opts ...optionfunc)
(opt *option)
return
}
測試一下:
func
main()
輸出:
&&&
這樣乙個使用函式式選項設計模式的建構函式就實現了。這樣預設值也有了,以後再要為option新增新的字段也不會影響之前的**。
推薦閱讀:
go 函式式選項模式
golang 設計模式之選項模式
有時候乙個函式會有很多引數,為了方便函式的使用,我們會給希望給一些引數設定預設值,呼叫時只需要傳與預設值不同的引數即可,類似於 python 裡面的預設引數和字典引數,雖然 golang 裡面既沒有預設引數也沒有字典引數,但是我們有選項模式 在這之前,首先需要介紹一下可變長引數列表,顧名思義,就是引...
go語言設計模式之工廠模式 位元組教育
工廠模式 factory pattern 是最常用的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在工廠模式中,建立物件時不會對客戶端暴露建立邏輯,並且時通過使用乙個共同的介面來執行新的建立的物件。乙個呼叫者想建立乙個物件,只知道物件名稱就可以了 擴充套件性高,如果...
go語言設計模式之命令模式 位元組教育
命令模式是將乙個請求封裝為乙個物件,從而使我們可用不同的請求對客戶進行引數化 對請求排隊或者記錄請求日誌,以及支援可撤銷的操作。命令模式是一種物件行為模式,其別名為動作模式或事務模式。乙個呼叫者想建立乙個物件,只知道物件名稱就可以了 擴充套件性高,如果想增加乙個產品,只要擴充套件乙個工廠類就可以 遮...