一文詳解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!
推薦閱讀:
- 詳解Golang函數式選項(Functional Options)模式
- Go語言中的Struct結構體
- Go 修改map slice array元素值操作
- GO 函數式選項模式(Functional Options Pattern)
- Go語言學習函數+結構體+方法+接口