一文詳解Go語(yǔ)言中的Option設(shè)計(jì)模式
關(guān)于什么是設(shè)計(jì)模式,筆者在這里就不做過(guò)多的解釋。大家自行百度谷歌就好。下面我們聊聊Option設(shè)計(jì)模式,這個(gè)單詞翻譯過(guò)來(lái)就是選項(xiàng)的意思。
它一般都是用在初始化數(shù)據(jù)的時(shí)候使用。
type User struct { // 必須初始化的值 Username string Age int // 非必要初始化的值 Password string }
結(jié)構(gòu)體中,有些字段是必須要初始化的,而有些則是不用。那些不用初始化的字段就被稱為可選項(xiàng)。用戶根據(jù)自己的實(shí)際需求對(duì)其進(jìn)行初始化。
一般來(lái)說(shuō),對(duì)于這種結(jié)構(gòu)體,不論是必須初始化的字段還是非必須的,都是私有的字段,不會(huì)暴露給外界。
下面是一個(gè)標(biāo)準(zhǔn)的Option的設(shè)計(jì)模式
// 定義一個(gè)Option函數(shù)簽名 type UserOption func(user *User) // 提供一個(gè)可選函數(shù) func WithUserPassword(password string) UserOption { return func(user *User) { user.Password = password } } type User struct { // 必須初始化的值 Username string Age int // 非必要初始化的值 Password string } // 定義一個(gè)初始化User的方法 func NewUser(username string, age int, opts...UserOption) *User { user := &User{ Username: username, Age: age, } for _, opt := range opts { opt(user) } return user }
步驟
- 定義一個(gè)結(jié)構(gòu)體,內(nèi)部字段全部都是私有的,并且存在必須初始化字段和非必要初始化字段
- 定義一個(gè)Option函數(shù)簽名,參數(shù)是結(jié)構(gòu)體指針,必須是結(jié)構(gòu)體指針,因?yàn)橹挥兄羔槻拍茉O(shè)置上值
- 定義一個(gè)初始化結(jié)構(gòu)體的方法,參數(shù)是結(jié)構(gòu)體必須要初始化的字段值,外加一個(gè)Option函數(shù)切片,返回值可以是結(jié)構(gòu)體,也可以是指針結(jié)構(gòu)體
- 初始化結(jié)構(gòu)體方法內(nèi)部先初始化好一個(gè)最基本的結(jié)構(gòu)體,然后遍歷Option函數(shù)切片
- 定義的Option函數(shù)實(shí)現(xiàn)最好用With開(kāi)頭,規(guī)范,不遵守也可以
Option模式變種
// 定義一個(gè)Option函數(shù)簽名 type UserOptionErr func(user *User) error // 提供一個(gè)可選函數(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 } // 定義一個(gè)初始化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ù)簽名的返回值,這種模式可以用作對(duì)Option函數(shù)的參數(shù)進(jìn)行校驗(yàn)。由于這里發(fā)生了變更,導(dǎo)致初始化結(jié)構(gòu)體的方法也需要做出相應(yīng)的變化。
對(duì)于Option模式,在很多場(chǎng)景中都能用到,并且也是非常好用的。大家記住它是在初始化數(shù)據(jù)的時(shí)候用就行,代碼模式相對(duì)固定。
到此這篇關(guān)于一文詳解Go語(yǔ)言中的Option設(shè)計(jì)模式的文章就介紹到這了,更多相關(guān)Go Option設(shè)計(jì)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言指針訪問(wèn)結(jié)構(gòu)體的方法
這篇文章主要介紹了Go語(yǔ)言指針訪問(wèn)結(jié)構(gòu)體的方法,涉及Go語(yǔ)言指針及結(jié)構(gòu)體的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Golang實(shí)現(xiàn)常見(jiàn)的限流算法的示例代碼
限流是項(xiàng)目中經(jīng)常需要使用到的一種工具,一般用于限制用戶的請(qǐng)求的頻率,也可以避免瞬間流量過(guò)大導(dǎo)致系統(tǒng)崩潰,或者穩(wěn)定消息處理速率,本文主要介紹了使用Go實(shí)現(xiàn)常見(jiàn)的限流算法,希望對(duì)大家有所幫助2023-04-04golang進(jìn)程內(nèi)存控制避免docker內(nèi)oom
這篇文章主要為大家介紹了golang進(jìn)程內(nèi)存控制避免docker內(nèi)oom示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法
今天小編就為大家分享一篇Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08詳解Golang中channel的實(shí)現(xiàn)
channel俗稱管道,用于數(shù)據(jù)傳遞或數(shù)據(jù)共享,其本質(zhì)是一個(gè)先進(jìn)先出的隊(duì)列,使用goroutine+channel進(jìn)行數(shù)據(jù)通訊簡(jiǎn)單高效,同時(shí)也線程安全,本文就給大家講講Golang中channel的實(shí)現(xiàn),需要的朋友可以參考下2023-09-09Go語(yǔ)言學(xué)習(xí)教程之聲明語(yǔ)法(譯)
Golang 就是類C的語(yǔ)法,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言學(xué)習(xí)教程之聲明語(yǔ)法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11Go語(yǔ)言中的init函數(shù)特點(diǎn)及用法詳解
在Go語(yǔ)言中,init()函數(shù)是一種特殊的函數(shù),用于在程序啟動(dòng)時(shí)自動(dòng)執(zhí)行一次。它的存在為我們提供了一種機(jī)制,可以在程序啟動(dòng)時(shí)進(jìn)行一些必要的初始化操作,為程序的正常運(yùn)行做好準(zhǔn)備,在這篇文章中,我們將詳細(xì)探討init()函數(shù)的特點(diǎn)、用途和注意事項(xiàng)2023-06-06