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

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

它一般都是用在初始化數據的時候使用。

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

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

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

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

// 定義一個Option函數簽名
type UserOption func(user *User)

// 提供一個可選函數
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函數簽名,參數是結構體指針,必須是結構體指針,因為隻有指針才能設置上值
  • 定義一個初始化結構體的方法,參數是結構體必須要初始化的字段值,外加一個Option函數切片,返回值可以是結構體,也可以是指針結構體
  • 初始化結構體方法內部先初始化好一個最基本的結構體,然後遍歷Option函數切片
  • 定義的Option函數實現最好用With開頭,規范,不遵守也可以

Option模式變種

// 定義一個Option函數簽名
type UserOptionErr func(user *User) error

// 提供一個可選函數
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
}

大傢應該發現瞭,就是修改Option函數簽名的返回值,這種模式可以用作對Option函數的參數進行校驗。由於這裡發生瞭變更,導致初始化結構體的方法也需要做出相應的變化。

對於Option模式,在很多場景中都能用到,並且也是非常好用的。大傢記住它是在初始化數據的時候用就行,代碼模式相對固定。

到此這篇關於一文詳解Go語言中的Option設計模式的文章就介紹到這瞭,更多相關Go Option設計模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: