欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解Go語(yǔ)言中的Option設(shè)計(jì)模式

 更新時(shí)間:2023年05月07日 10:29:02   作者:今天撿到一百塊錢  
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中Option設(shè)計(jì)模式的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下

關(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)文章

  • Golang爬蟲框架 colly的使用

    Golang爬蟲框架 colly的使用

    本文主要介紹了Golang爬蟲框架 colly的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Go語(yǔ)言MessageBox用法實(shí)例

    Go語(yǔ)言MessageBox用法實(shí)例

    這篇文章主要介紹了Go語(yǔ)言MessageBox用法,實(shí)例分析了MessageBox提示框的實(shí)現(xiàn)與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語(yǔ)言指針訪問(wèn)結(jié)構(gòu)體的方法

    Go語(yǔ)言指針訪問(wèn)結(jié)構(gòu)體的方法

    這篇文章主要介紹了Go語(yǔ)言指針訪問(wèn)結(jié)構(gòu)體的方法,涉及Go語(yǔ)言指針及結(jié)構(gòu)體的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Golang實(shí)現(xiàn)常見(jiàn)的限流算法的示例代碼

    Golang實(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-04
  • golang進(jìn)程內(nèi)存控制避免docker內(nèi)oom

    golang進(jìn)程內(nèi)存控制避免docker內(nèi)oom

    這篇文章主要為大家介紹了golang進(jìn)程內(nèi)存控制避免docker內(nèi)oom示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 詳解如何使用Golang擴(kuò)展Envoy

    詳解如何使用Golang擴(kuò)展Envoy

    這篇文章主要為大家介紹了詳解如何使用Golang擴(kuò)展Envoy實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法

    Go 結(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)

    詳解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-09
  • Go語(yǔ)言學(xué)習(xí)教程之聲明語(yǔ)法(譯)

    Go語(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-11
  • Go語(yǔ)言中的init函數(shù)特點(diǎn)及用法詳解

    Go語(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

最新評(píng)論