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

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

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

關(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爬蟲框架 colly的使用

    Golang爬蟲框架 colly的使用

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

    Go語言MessageBox用法實例

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

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

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

    Golang實現(xiàn)常見的限流算法的示例代碼

    限流是項目中經(jīng)常需要使用到的一種工具,一般用于限制用戶的請求的頻率,也可以避免瞬間流量過大導(dǎo)致系統(tǒng)崩潰,或者穩(wěn)定消息處理速率,本文主要介紹了使用Go實現(xiàn)常見的限流算法,希望對大家有所幫助
    2023-04-04
  • golang進程內(nèi)存控制避免docker內(nèi)oom

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

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

    詳解如何使用Golang擴展Envoy

    這篇文章主要為大家介紹了詳解如何使用Golang擴展Envoy實現(xià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)換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 詳解Golang中channel的實現(xiàn)

    詳解Golang中channel的實現(xiàn)

    channel俗稱管道,用于數(shù)據(jù)傳遞或數(shù)據(jù)共享,其本質(zhì)是一個先進先出的隊列,使用goroutine+channel進行數(shù)據(jù)通訊簡單高效,同時也線程安全,本文就給大家講講Golang中channel的實現(xiàn),需要的朋友可以參考下
    2023-09-09
  • Go語言學(xué)習(xí)教程之聲明語法(譯)

    Go語言學(xué)習(xí)教程之聲明語法(譯)

    Golang 就是類C的語法,下面這篇文章主要給大家介紹了關(guān)于Go語言學(xué)習(xí)教程之聲明語法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Go語言中的init函數(shù)特點及用法詳解

    Go語言中的init函數(shù)特點及用法詳解

    在Go語言中,init()函數(shù)是一種特殊的函數(shù),用于在程序啟動時自動執(zhí)行一次。它的存在為我們提供了一種機制,可以在程序啟動時進行一些必要的初始化操作,為程序的正常運行做好準(zhǔn)備,在這篇文章中,我們將詳細探討init()函數(shù)的特點、用途和注意事項
    2023-06-06

最新評論