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

一文詳解Go語言中的Option設計模式

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

關于什么是設計模式,筆者在這里就不做過多的解釋。大家自行百度谷歌就好。下面我們聊聊Option設計模式,這個單詞翻譯過來就是選項的意思。

它一般都是用在初始化數(shù)據(jù)的時候使用。

type User struct {
    // 必須初始化的值
    Username string
    Age int
    
    // 非必要初始化的值
    Password string
}

結構體中,有些字段是必須要初始化的,而有些則是不用。那些不用初始化的字段就被稱為可選項。用戶根據(jù)自己的實際需求對其進行初始化。

一般來說,對于這種結構體,不論是必須初始化的字段還是非必須的,都是私有的字段,不會暴露給外界。

下面是一個標準的Option的設計模式

// 定義一個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
}

步驟

  • 定義一個結構體,內部字段全部都是私有的,并且存在必須初始化字段和非必要初始化字段
  • 定義一個Option函數(shù)簽名,參數(shù)是結構體指針,必須是結構體指針,因為只有指針才能設置上值
  • 定義一個初始化結構體的方法,參數(shù)是結構體必須要初始化的字段值,外加一個Option函數(shù)切片,返回值可以是結構體,也可以是指針結構體
  • 初始化結構體方法內部先初始化好一個最基本的結構體,然后遍歷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
}

大家應該發(fā)現(xiàn)了,就是修改Option函數(shù)簽名的返回值,這種模式可以用作對Option函數(shù)的參數(shù)進行校驗。由于這里發(fā)生了變更,導致初始化結構體的方法也需要做出相應的變化。

對于Option模式,在很多場景中都能用到,并且也是非常好用的。大家記住它是在初始化數(shù)據(jù)的時候用就行,代碼模式相對固定。

到此這篇關于一文詳解Go語言中的Option設計模式的文章就介紹到這了,更多相關Go Option設計模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言實現(xiàn)的一個簡單Web服務器

    Go語言實現(xiàn)的一個簡單Web服務器

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

    深入了解Golang為什么需要超時控制

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

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

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

    golang 實現(xiàn)時間滑動窗口的示例代碼

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

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

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

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

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

    Go語言基礎go build命令用法及示例詳解

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

    golang防止內存逃逸的方法小結

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

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

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

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

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

最新評論

陆良县| 四川省| 简阳市| 安康市| 石狮市| 边坝县| 通州市| 岳西县| 永新县| 湘潭市| 安西县| 五家渠市| 营口市| 武夷山市| 崇阳县| 南澳县| 双城市| 旬阳县| 曲阜市| 南陵县| 桦川县| 江安县| 林西县| 苏尼特左旗| 武汉市| 阿尔山市| 洛浦县| 钦州市| 卢湾区| 天等县| 兰坪| 涡阳县| 乡宁县| 长丰县| 延长县| 通辽市| 牡丹江市| 克拉玛依市| 济阳县| 永州市| 高碑店市|