最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解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ì)模式,筆者在這里就不做過多的解釋。大家自行百度谷歌就好。下面我們聊聊Option設(shè)計(jì)模式,這個(gè)單詞翻譯過來(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)說,對(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開頭,規(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ǔ)言實(shí)現(xiàn)的一個(gè)簡(jiǎn)單Web服務(wù)器

    Go語(yǔ)言實(shí)現(xiàn)的一個(gè)簡(jiǎn)單Web服務(wù)器

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)的一個(gè)簡(jiǎn)單Web服務(wù)器,本文先是給出一個(gè)使用http包建立的Web服務(wù)器源碼,并對(duì)比了其它編程語(yǔ)言,需要的朋友可以參考下
    2014-10-10
  • 深入了解Golang為什么需要超時(shí)控制

    深入了解Golang為什么需要超時(shí)控制

    本文將介紹為什么需要超時(shí)控制,然后詳細(xì)介紹Go語(yǔ)言中實(shí)現(xiàn)超時(shí)控制的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼

    GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼

    你對(duì)二維碼掃碼的流程有困惑嗎,這篇文章就結(jié)合筆者自身的開發(fā)經(jīng)驗(yàn)進(jìn)行分享,讓大家熟悉并掌握此功能,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-06-06
  • golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口的示例代碼

    golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口的示例代碼

    滑動(dòng)時(shí)間窗口就是把一段時(shí)間片分為多個(gè)樣本窗口,可以通過更細(xì)粒度對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),這篇文章主要介紹了golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口,需要的朋友可以參考下
    2022-10-10
  • Go語(yǔ)言實(shí)現(xiàn)互斥鎖、隨機(jī)數(shù)、time、List

    Go語(yǔ)言實(shí)現(xiàn)互斥鎖、隨機(jī)數(shù)、time、List

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)互斥鎖、隨機(jī)數(shù)、time、List的相關(guān)資料,需要的朋友可以參考下
    2018-10-10
  • Go Module常用命令及如何使用Go Module

    Go Module常用命令及如何使用Go Module

    go module是go官方自帶的go依賴管理庫(kù),在1.13版本正式推薦使用,這篇文章主要介紹了Go Module常用命令及如何使用Go Module,需要的朋友可以參考下
    2024-02-02
  • Go語(yǔ)言基礎(chǔ)go build命令用法及示例詳解

    Go語(yǔ)言基礎(chǔ)go build命令用法及示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)go build命令用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • golang防止內(nèi)存逃逸的方法小結(jié)

    golang防止內(nèi)存逃逸的方法小結(jié)

    在Go語(yǔ)言中,內(nèi)存逃逸是指在函數(shù)中分配的變量在函數(shù)結(jié)束后仍然被引用,防止內(nèi)存逃逸有助于提高程序的性能,因?yàn)闂I戏峙涞膬?nèi)存可以更快地被回收,本文給大家總結(jié)了一些防止內(nèi)存逃逸的方法,需要的朋友可以參考下
    2024-02-02
  • Golang創(chuàng)建第一個(gè)web項(xiàng)目(Gin+Gorm)

    Golang創(chuàng)建第一個(gè)web項(xiàng)目(Gin+Gorm)

    本文主要介紹了Golang創(chuàng)建第一個(gè)web項(xiàng)目(Gin+Gorm),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • go 指針接收者和值接收者的區(qū)別小結(jié)

    go 指針接收者和值接收者的區(qū)別小結(jié)

    在Go 語(yǔ)言中,值接收者和指針接收者是方法定義中的兩種接收者類型,本文主要介紹了go 指針接收者和值接收者的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04

最新評(píng)論

长武县| 宁德市| 清流县| 建瓯市| 剑川县| 宝应县| 芜湖市| 方正县| 凤冈县| 阿克苏市| 扬中市| 张家口市| 堆龙德庆县| 云安县| 泸西县| 贞丰县| 石阡县| 集贤县| 辽阳县| 平山县| 五华县| 永新县| 巴青县| 汉寿县| 武平县| 青海省| 靖远县| 呈贡县| 许昌市| 三河市| 潜江市| 盘山县| 上蔡县| 米泉市| 宿迁市| 福鼎市| 大埔县| 佛冈县| 页游| 信宜市| 静乐县|