一文詳解Go語言中的Option設(shè)計模式
關(guān)于什么是設(shè)計模式,筆者在這里就不做過多的解釋。大家自行百度谷歌就好。下面我們聊聊Option設(shè)計模式,這個單詞翻譯過來就是選項的意思。
它一般都是用在初始化數(shù)據(jù)的時候使用。
type User struct { // 必須初始化的值 Username string Age int // 非必要初始化的值 Password string }
結(jié)構(gòu)體中,有些字段是必須要初始化的,而有些則是不用。那些不用初始化的字段就被稱為可選項。用戶根據(jù)自己的實際需求對其進行初始化。
一般來說,對于這種結(jié)構(gòu)體,不論是必須初始化的字段還是非必須的,都是私有的字段,不會暴露給外界。
下面是一個標(biāo)準(zhǔn)的Option的設(shè)計模式
// 定義一個Option函數(shù)簽名 type UserOption func(user *User) // 提供一個可選函數(shù) func WithUserPassword(password string) UserOption { return func(user *User) { user.Password = password } } type User struct { // 必須初始化的值 Username string Age int // 非必要初始化的值 Password string } // 定義一個初始化User的方法 func NewUser(username string, age int, opts...UserOption) *User { user := &User{ Username: username, Age: age, } for _, opt := range opts { opt(user) } return user }
步驟
- 定義一個結(jié)構(gòu)體,內(nèi)部字段全部都是私有的,并且存在必須初始化字段和非必要初始化字段
- 定義一個Option函數(shù)簽名,參數(shù)是結(jié)構(gòu)體指針,必須是結(jié)構(gòu)體指針,因為只有指針才能設(shè)置上值
- 定義一個初始化結(jié)構(gòu)體的方法,參數(shù)是結(jié)構(gòu)體必須要初始化的字段值,外加一個Option函數(shù)切片,返回值可以是結(jié)構(gòu)體,也可以是指針結(jié)構(gòu)體
- 初始化結(jié)構(gòu)體方法內(nèi)部先初始化好一個最基本的結(jié)構(gòu)體,然后遍歷Option函數(shù)切片
- 定義的Option函數(shù)實現(xiàn)最好用With開頭,規(guī)范,不遵守也可以
Option模式變種
// 定義一個Option函數(shù)簽名 type UserOptionErr func(user *User) error // 提供一個可選函數(shù) func WithUserPassword(password string) UserOption { return func(user *User) error { if password == "" { return errors.New("password 不能為空") } user.Password = password return nil } } type User struct { // 必須初始化的值 Username string Age int // 非必要初始化的值 Password string } // 定義一個初始化User的方法 func NewUser(username string, age int, opts...UserOption) (*User, error) { user := &User{ Username: username, Age: age, } for _, opt := range opts { if err := opt(user); err != nil { return nil, err } } return user, nil }
大家應(yīng)該發(fā)現(xiàn)了,就是修改Option函數(shù)簽名的返回值,這種模式可以用作對Option函數(shù)的參數(shù)進行校驗。由于這里發(fā)生了變更,導(dǎo)致初始化結(jié)構(gòu)體的方法也需要做出相應(yīng)的變化。
對于Option模式,在很多場景中都能用到,并且也是非常好用的。大家記住它是在初始化數(shù)據(jù)的時候用就行,代碼模式相對固定。
到此這篇關(guān)于一文詳解Go語言中的Option設(shè)計模式的文章就介紹到這了,更多相關(guān)Go Option設(shè)計模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang進程內(nèi)存控制避免docker內(nèi)oom
這篇文章主要為大家介紹了golang進程內(nèi)存控制避免docker內(nèi)oom示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法
今天小編就為大家分享一篇Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08