成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個(gè)活躍在眾多 Go 項(xiàng)目中的編程模式

開發(fā) 前端
今天我們介紹一個(gè)在 Go 語言中非常流行的編程模式:函數(shù)式選項(xiàng)模式(Functional Options)。該模式解決的問題是,如何更動(dòng)態(tài)靈活地為對(duì)象配置參數(shù)。可能讀者不太明白該痛點(diǎn),不急,我們將在下文詳細(xì)詳解。

今天我們介紹一個(gè)在 Go 語言中非常流行的編程模式:函數(shù)式選項(xiàng)模式(Functional Options)。該模式解決的問題是,如何更動(dòng)態(tài)靈活地為對(duì)象配置參數(shù)??赡茏x者不太明白該痛點(diǎn),不急,我們將在下文詳細(xì)詳解。

問題

假設(shè)我們?cè)诖a中定義了一個(gè)用戶的結(jié)構(gòu)體對(duì)象 User,它擁有以下屬性。

type User struct {
ID string // 必需項(xiàng)
Name string // 必需項(xiàng)
Age int // 非必需項(xiàng)
Gender bool // 非必需項(xiàng)
}

初始化該對(duì)象時(shí),最簡單的方式是直接填充屬性值,例如

u := &User{ID: "12glkui234d", Name: "菜刀", Age: 18, Gender: true}

但是這里存在一個(gè)問題:User 對(duì)象中的屬性并不一定都是可導(dǎo)出的,例如 User 有一個(gè)屬性字段為 password(首字母小寫,非導(dǎo)出),如果在其他模塊中需要構(gòu)造 User 對(duì)象,這樣就不能填充該 password 字段了。

所以我們需要定義構(gòu)造 User 對(duì)象的函數(shù),首先能想到最簡單的構(gòu)造函數(shù)方式如下。

func NewUser(id, name string, age int, gender bool) *User {
return &User{
ID: id,
Name: name,
Age: age,
Gender: gender,
}
}

但是這樣也存在一些問題:對(duì)于 User 對(duì)象而言,只有 ID、Name 屬性是必須的,Age 與 Gender 為非必需項(xiàng),且并不能設(shè)置默認(rèn)值,例如 Age 的默認(rèn)值為 0,Gender 的默認(rèn)值是 false ,這顯然不太合理。

面對(duì)該問題,我們可以采用的解決方案有哪些呢?

方案一:多函數(shù)構(gòu)造

我們能想到最粗暴地解決方法是:為每種參數(shù)情況設(shè)置一種構(gòu)造函數(shù)。如下代碼所示

func NewUser(id, name string) *User {
return &User{ID: id, Name: name}
}

func NewUserWithAge(id, name string, age int) *User {
return &User{ID: id, Name: name, Age: age}
}

func NewUserWithGender(id, name string, gender bool) *User {
return &User{ID: id, Name: name, Gender: gender}
}

func NewUserWithAgeGender(id, name string, age int, gender bool) *User {
return &User{ID: id, Name: name, Age: age, Gender: gender}
}

這種方式適合參數(shù)較少且不易發(fā)生變化的情況。該方式在 Go 標(biāo)準(zhǔn)庫中也有使用,例如 net 包中的 Dial 和 DialTimeout 方法。

func Dial(network, address string) (Conn, error) {}
func DialTimeout(network, address string, timeout time.Duration) (Conn, error) {}

但該方式的缺陷也很明顯:試想,如果構(gòu)造對(duì)象 User 增加了參數(shù)字段 Phone,那么我們需要新增多少個(gè)組合函數(shù)?

方案二:配置化

另外一種常見的方式是配置化,我們將所有可選的參數(shù)放入一個(gè) Config 的配置結(jié)構(gòu)體中。

type User struct {
ID string
Name string
Cfg *Config
}

type Config struct {
Age int
Gender bool
}

func NewUser(id, name string, cfg *Config) *User {
return &User{ID: id, Name: name, Cfg: cfg}
}

這樣,我們只需要一個(gè) NewUser() 函數(shù),不管之后增加多少配置選項(xiàng),NewUser 函數(shù)都不會(huì)得到破壞。

但是,這種方式,我們需要先構(gòu)造 Config 對(duì)象,這時(shí)候?qū)?Config 的構(gòu)造又回到了方案一中存在的問題。

方案三:函數(shù)式選項(xiàng)模式

面對(duì)這樣的問題,我們還可以選擇函數(shù)式選項(xiàng)模式。

首先,我們定義一個(gè) Option 函數(shù)類型

type Option func(*User)

然后,為每個(gè)屬性值定義一個(gè)返回 Option 函數(shù)的函數(shù)

func WithAge(age int) Option {
return func(u *User) {
u.Age = age
}
}

func WithGender(gender bool) Option {
return func(u *User) {
u.Gender = gender
}
}

此時(shí),我們將 User 對(duì)象的構(gòu)造函數(shù)改為如下所示

func NewUser(id, name string, options ...Option) *User {
u := &User{ID: id, Name: name}
for _, option := range options {
option(u)
}
return u
}

按照這種構(gòu)造方式,我們就可以這樣配置 User 對(duì)象了

u := NewUser("12glkui234d", "菜刀", WithAge(18), WithGender(true))

以后不管 User 增加任何參數(shù) XXX,我們只需要增加對(duì)應(yīng)的 WithXXX 函數(shù)即可,是不是非常地優(yōu)雅?

Functional Options 這種編程模式,我們經(jīng)常能在各種項(xiàng)目中找到它的身影。例如,我在 tidb 項(xiàng)目中僅使用 opts ... 關(guān)鍵字搜索,就能看到這么多使用了 Functional Options 的代碼(截圖還未包括全部)。

總結(jié)

函數(shù)式選項(xiàng)模式解決了如何動(dòng)態(tài)靈活地為對(duì)象配置參數(shù)的問題, 但是需要在合適的場景才使用它。

當(dāng)對(duì)象的配置參數(shù)復(fù)雜,例如可選參數(shù)多、非導(dǎo)入字段、參數(shù)可能隨版本增加等情況,這時(shí)函數(shù)式選項(xiàng)模式就可以很好地幫助到我們。


責(zé)任編輯:武曉燕 來源: Golang技術(shù)分享
相關(guān)推薦

2015-08-03 11:45:37

storyboard

2023-09-14 08:46:50

ReactVue

2022-04-27 05:55:43

去QA化自動(dòng)化測試開發(fā)

2024-12-11 09:13:00

2021-03-07 22:37:17

Go代碼模式

2024-08-19 01:10:00

RedisGo代碼

2024-05-13 08:40:02

Go事件驅(qū)動(dòng)編程

2024-10-17 08:58:31

2017-03-20 18:03:51

2017-11-14 11:12:50

Go語言編譯器

2021-06-02 08:00:57

WebAsyncTas項(xiàng)目異步

2024-03-04 00:00:00

GolangNode.js性能

2015-10-12 15:50:07

PaaS云平臺(tái)開發(fā)go

2020-06-28 08:10:00

GoGOSSAFUNC圖編程語言

2023-10-12 14:22:45

2021-11-28 22:33:01

Go選項(xiàng)模式

2018-04-27 16:00:15

Windows上帝模式

2022-05-22 13:55:30

Go 語言

2024-01-02 10:46:14

2024-08-12 08:15:46

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品美女久久久久久免费 | 日韩av免费看 | 色妹子综合网 | 国产综合在线视频 | 国产精品区二区三区日本 | 精品久久网 | 99国产精品视频免费观看一公开 | 黄色免费看 | 韩日在线观看视频 | 97免费在线视频 | 久久久久精| 久久精品国产99国产 | 中文字幕亚洲区一区二 | 一区二区三区国产 | 国产精品九九九 | 久久电影一区 | 国产精品美女久久久久 | 一区二区三区四区免费视频 | 久久国产精品-国产精品 | 九九久久免费视频 | 一区精品视频 | 福利视频一区二区 | 在线亚洲电影 | 欧美日韩福利视频 | 色婷婷亚洲| 在线视频 中文字幕 | 日韩在线观看网站 | 久久久久久久99 | 九九热精 | 狠狠狠干 | 天天影视综合 | 亚洲va国产日韩欧美精品色婷婷 | 91亚洲精品在线观看 | 国产精品一区免费 | 色播久久久 | 成年人在线观看 | 国产精品久久久久久中文字 | 欧美成人免费在线 | 成人超碰在线 | 色精品| 在线观看深夜视频 |