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

如何優(yōu)雅的用Golang封裝配置項(xiàng)(Functional Options)

開(kāi)發(fā) 前端
Golang 由于語(yǔ)言本身的特性,不支持函數(shù)重載,函數(shù)式選項(xiàng) 的編程模式在一定程度上解決了其他語(yǔ)言需要通過(guò)函數(shù)重載解決的問(wèn)題。

導(dǎo)讀?

最近要封裝一個(gè)公共服務(wù),涉及到配置項(xiàng)的地方總是找不到合理的方案,后來(lái)看了一下grpc在配置方面的封裝,了解到原來(lái)是golang特有的Functional Options編程模式,今天分享給大家,希望你能用到,咱們直接來(lái)看代碼

版本V1

圖片

上面代碼很容易,就是想初始化一下Server的配置選項(xiàng),看起來(lái)好像沒(méi)什么問(wèn)題,其實(shí)問(wèn)題非常多

  • 既然是初始化一些配置選項(xiàng),那么當(dāng)然是有的是必選項(xiàng)(Addr, Port),有的是可選項(xiàng)(Timeout,MaxConns),可選項(xiàng)不選的話(huà)還得給個(gè)默認(rèn)值,顯然這種方式是不滿(mǎn)足的
  • 因?yàn)镾erver的屬性都是公有方法,所以在外部任何地方都能修改屬性,存在很?chē)?yán)重的代碼安全隱患
  • 上面Server和main函數(shù)雖然在同一個(gè)文件里面,其實(shí)Server是作為外部包使用的,下面的case都同理 既然上面無(wú)法滿(mǎn)足咱們的需求,那么咱們就來(lái)修改一下

版本V2

既然配置項(xiàng)想要可選,那么咱們直接來(lái)個(gè)排列組合,調(diào)用不同的初始化方法即可只初始化自己想初始化的非必要選項(xiàng)

圖片

  • Server的屬性都是私有變量,的確是解決了包的屬性被惡意篡改的行為,降低了代碼風(fēng)險(xiǎn)
  • 但是排列組合太多,新增一個(gè)屬性得新增指數(shù)級(jí)的方法,我上面的demo可選參數(shù)只有兩個(gè)timeout和maxConns,但是如果有十幾個(gè)可選參數(shù),那么需要構(gòu)造的初始化方法是非常多的
  • 一般情況下,對(duì)一個(gè)工具初始化都是統(tǒng)一的方法,這樣處理的話(huà)初始化方法太多了,這一塊的內(nèi)容對(duì)使用者來(lái)說(shuō)是不關(guān)心的,所以很不友好
  • 不想傳的參數(shù)的默認(rèn)值依然沒(méi)有解決

版本V3

既然上面的例子封裝的初始化方法太多,那么咱們就統(tǒng)一用一個(gè)方法來(lái)解決

圖片

  • 這樣做的確是解決了初始化方法太多的問(wèn)題,但是太不靈活
  • 比如有100個(gè)可選參數(shù),那而且你只想給最后一個(gè)可選參數(shù)賦值,但是前面99個(gè)你也得寫(xiě),寫(xiě)的話(huà)具體寫(xiě)幾?我既然不關(guān)心前面99個(gè)可選參數(shù),但是為什么還要寫(xiě)呢?這給人感覺(jué)就很奇怪

版本V4

咱們引入一個(gè)新的結(jié)構(gòu)體Config,把必填的參數(shù)放在server里面,非必要的參數(shù)放在Congfig里面

圖片

  • 解決了非必要參數(shù)可以有選擇性的傳一部分的問(wèn)題,比如上面的case種只需要傳Timeout
  • 也解決了不傳的參數(shù),能有默認(rèn)值的問(wèn)題,比如MaxConns不傳的話(huà) 就是10
  • 但是如果只傳必傳的參數(shù),那么在NewDefaultServer的時(shí)候,最后一個(gè)參數(shù)只能傳nil,傳nil的情況是不允許的,也是不友好的。
  • 用這種方式的話(huà),Config的屬性必須是公共變量,當(dāng)然就有在運(yùn)行的過(guò)程中屬性被篡改的風(fēng)險(xiǎn)

版本V5

咱們來(lái)學(xué)一學(xué)java中的builder模式

圖片

  • 其實(shí)就是在Server對(duì)象外部包了一層ServerBuilder,最后在ServerBuilder.Build()中返回了Server對(duì)象
  • 其實(shí)這個(gè)方法挺完美,滿(mǎn)足了我們之前提的全部需求,但是問(wèn)題在于,golang中的err處理,在這種方式中不是很好體現(xiàn)

版本V6

接下來(lái)咱們就看一看最后的終極解決方案 FUNCTIONAL OPTIONS模式

圖片

  • 這個(gè)需要注意的是  type Option func(*Server)
  • 這個(gè)看起來(lái)比較整潔和優(yōu)雅,對(duì)外的接口只有一個(gè)Create。
  • 相比于Builder模式,不需要引入一個(gè)Builder對(duì)象。
  • 對(duì)比配置化的模式,也不需要引入一個(gè)新的Config。

總結(jié)?

Golang 由于語(yǔ)言本身的特性,不支持函數(shù)重載,函數(shù)式選項(xiàng) 的編程模式在一定程度上解決了其他語(yǔ)言需要通過(guò)函數(shù)重載解決的問(wèn)題。函數(shù)式選項(xiàng) 編程有以下優(yōu)點(diǎn):

  • 任意順序傳遞參數(shù)
  • 支持默認(rèn)值
  • 向后兼容性
  • 很容易維護(hù)和擴(kuò)展

雖然 函數(shù)式選項(xiàng) 編程模式有很多優(yōu)點(diǎn),但是設(shè)計(jì)模式的存在都是為了彌補(bǔ)語(yǔ)言特性的缺陷的一種手段。它是為了解決代碼擴(kuò)展性的問(wèn)題,往往是通過(guò)增加抽象犧牲了簡(jiǎn)單性,切勿過(guò)度使用。有些簡(jiǎn)單的配置,就不需要設(shè)計(jì)的這么通用了。

函數(shù)式選項(xiàng)模式的使用場(chǎng)景有哪些呢:

我們一般用來(lái)配置一些基礎(chǔ)的服務(wù)配置,比如MySQL,Redis,Kafka的配置,很多可選參數(shù),可以方便動(dòng)態(tài)靈活的配置想要配置的參數(shù)。

責(zé)任編輯:姜華 來(lái)源: 程序員小飯
相關(guān)推薦

2023-12-05 07:26:21

Golang項(xiàng)目結(jié)構(gòu)

2020-11-23 14:16:42

Golang

2024-04-02 09:55:36

GolangColly開(kāi)發(fā)者

2025-01-13 06:00:00

Go語(yǔ)言gRPC

2021-07-15 08:58:15

指定配置項(xiàng)Go

2021-03-15 11:02:04

Docker網(wǎng)絡(luò)代理Linux

2022-08-03 07:07:10

Spring數(shù)據(jù)封裝框架

2023-01-14 08:12:53

KnowTopic配置

2010-09-15 09:03:44

JavaScript

2022-06-07 08:59:58

hookuseRequestReact 項(xiàng)目

2014-03-18 11:11:45

Citrix XenDGRID vGPU

2011-11-08 21:55:58

MRTG 配置

2011-03-30 15:05:40

MRTG安裝

2011-04-02 15:26:51

Cacti安裝

2011-03-25 13:40:28

Cacti安裝配置

2011-04-02 15:26:58

Cacti安裝

2011-04-02 15:17:59

2023-03-16 07:52:47

Golang函數(shù)式編程

2015-11-26 10:53:45

LinuxWindowsMac OS

2021-01-19 10:35:49

JVM場(chǎng)景函數(shù)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 日本成人一区二区 | 欧洲一区二区视频 | 亚洲 欧美 日韩 在线 | 国产黄色大片在线免费观看 | 亚洲欧美日本国产 | 欧美日韩在线一区二区三区 | 欧美午夜激情在线 | 成人黄色在线 | 九九热在线免费视频 | 亚洲欧洲精品成人久久奇米网 | 久久9精品 | 亚洲精品免费视频 | 国产亚洲精品a | 日本一区二区三区免费观看 | 日韩aⅴ在线观看 | 国产精品96久久久久久 | 人人草天天草 | 日韩欧美在线观看 | 日韩欧美在线播放 | 在线91 | 91网站在线看 | 亚洲三级av | 亚洲欧美在线视频 | 一区二区三区四区不卡 | 国产中文字幕在线观看 | 日韩中文字幕在线观看视频 | 久久av在线播放 | 亚洲成人三区 | 国产探花在线精品一区二区 | 久久久精品一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 日本不卡一区二区三区在线观看 | 91精品国产综合久久久久久 | 久久99精品久久久久久青青日本 | 动漫www.被爆羞羞av44 | 国产最新网址 | 91精品国产综合久久久久久 | 精品国产一区二区三区久久久蜜月 | 日韩精品免费视频 | 欧美激情在线一区二区三区 | 欧美一级免费 |