真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言參數(shù)設(shè)置 go語言chan

go 的選項(xiàng)模式

現(xiàn)在有個(gè)結(jié)構(gòu)體如下定義:

渦陽網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司

我們需要初始化結(jié)構(gòu)體,如果是其他語言,函數(shù)支持默認(rèn)參數(shù):

但是,go語言函數(shù)不支持默認(rèn)參數(shù),同時(shí)即使go語言支持默認(rèn)參數(shù),但是如果配置項(xiàng)過多,那么每一個(gè)配置項(xiàng)都得寫一個(gè)默認(rèn)參數(shù),也不現(xiàn)實(shí)。

那么,在go語言中,我們怎么優(yōu)雅的給其初始化呢,這時(shí),就需要利用選項(xiàng)模式了(option)。

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

它接收一個(gè)參數(shù): *Server 。

然后定義一個(gè) NewServer 函數(shù),它接收一個(gè) Option類型的不定參數(shù):

最后,再直接定義一系列返回 Option的函數(shù)

使用時(shí),直接:

golang 怎么定義可變參數(shù)的函數(shù)

golang定義可變參數(shù)的函數(shù)方法是:

—- 采用ANSI標(biāo)準(zhǔn)形式時(shí),參數(shù)個(gè)數(shù)可變的函數(shù)的原型聲明是:

type funcname(type para1, type para2, …)

—- 這種形式至少需要一個(gè)普通的形式參數(shù),后面的省略號(hào)不表示省略,而是函數(shù)原型的一部分。type是函數(shù)返回值和形式參數(shù)的類型。

—- 采用與UNIX System V兼容的聲明方式時(shí),參數(shù)個(gè)數(shù)可變的函數(shù)原型是:

type funcname(va_alist)

va_dcl

—- 這種形式不需要提供任何普通的形式參數(shù)。

type是函數(shù)返回值的類型。va_dcl是對函數(shù)原型聲明中參數(shù)va_alist的詳細(xì)聲明,實(shí)際是一個(gè)宏定義,對不同的硬件平臺(tái)采用不同的類型來定義,但在最后都包括了一個(gè)分號(hào)。因此va_dcl后不再需要加上分號(hào)了。va_dcl在代碼中必須原樣給出。va_alist在VC中可以原樣給出,也可以略去。

此外,采用頭文件stdarg.h編寫的程序是符合ANSI標(biāo)準(zhǔn)的,可以在各種操作系統(tǒng)和硬件上運(yùn)行;而采用頭文件varargs.h的方式僅僅是為了與以前的程序兼容。所以建議使用前者。

Go語言實(shí)踐模式 - 函數(shù)選項(xiàng)模式(Functional Options Pattern)

大家好,我是小白,有點(diǎn)黑的那個(gè)白。

最近遇到一個(gè)問題,因?yàn)闃I(yè)務(wù)需求,需要對接第三方平臺(tái).

而三方平臺(tái)提供的一些HTTP(S)接口都有統(tǒng)一的密鑰生成規(guī)則要求.

為此我們封裝了一個(gè)獨(dú)立的包 xxx-go-sdk 以便維護(hù)和對接使用.

其中核心的部分是自定義HTTP Client,如下:

一些平臺(tái)會(huì)要求appKey/appSecret等信息,所以Client結(jié)構(gòu)體就變成了這樣,這時(shí)參數(shù)還比較少, 而且是必填的參數(shù),我們可以提供構(gòu)造函數(shù)來明確指定。

看起來很滿足,但是當(dāng)我們需要增加一個(gè) Timeout 參數(shù)來控制超時(shí)呢?

或許你會(huì)說這還不簡單,像下面一樣再加一個(gè)參數(shù)唄

那再加些其他的參數(shù)呢?那構(gòu)造函數(shù)的參數(shù)是不是又長又串,而且每個(gè)參數(shù)不一定是必須的,有些參數(shù)我們又會(huì)考慮默認(rèn)值的問題。

為此,勤勞但尚未致富的 gophers 們使用了總結(jié)一種實(shí)踐模式

首先提取所有需要的參數(shù)到一個(gè)獨(dú)立的結(jié)構(gòu)體 Options,當(dāng)然你也可以用 Configs 啥的.

然后為每個(gè)參數(shù)提供設(shè)置函數(shù)

這樣我們就為每個(gè)參數(shù)設(shè)置了獨(dú)立的設(shè)置函數(shù)。返回值 func(*Options) 看著有點(diǎn)不友好,我們提取下定義為單個(gè) Option 調(diào)整一下代碼

當(dāng)我們需要添加更多的參數(shù)時(shí),只需要在 Options 添加新的參數(shù)并添加新參數(shù)的設(shè)置函數(shù)即可。

比如現(xiàn)在要添加新的參數(shù) Timeout

這樣后續(xù)不管新增多少參數(shù),只需要新增配置項(xiàng)并添加獨(dú)立的設(shè)置函數(shù)即可輕松擴(kuò)展,并且不會(huì)影響原有函數(shù)的參數(shù)順序和個(gè)數(shù)位置等。

至此,每個(gè)選項(xiàng)是區(qū)分開來了,那么怎么作用到我們的 Client 結(jié)構(gòu)體上呢?

首先,配置選項(xiàng)都被提取到了 Options 結(jié)構(gòu)體重,所以我們需要調(diào)整一下 Client 結(jié)構(gòu)體的參數(shù)

其次,每一個(gè)選項(xiàng)函數(shù)返回 Option,那么任意多個(gè)就是 ...Option,我們調(diào)整一下構(gòu)造函數(shù) NewClient 的參數(shù)形式,改為可變參數(shù),不再局限于固定順序的幾個(gè)參數(shù)。

然后循環(huán)遍歷每個(gè)選項(xiàng)函數(shù),來生成Client結(jié)構(gòu)體的完整配置選項(xiàng)。

那么怎么調(diào)用呢?對于調(diào)用方而已,直接在調(diào)用構(gòu)造函數(shù)NewClient()的參數(shù)內(nèi)添加自己需要的設(shè)置函數(shù)(WithXXX)即可

當(dāng)需要設(shè)置超時(shí)參數(shù),直接添加 WithTimeout即可,比如設(shè)置3秒的超時(shí)

配置選項(xiàng)的位置可以任意設(shè)置,不需要受常規(guī)的固定參數(shù)順序約束。

可以看到,這種實(shí)踐模式主要作用于配置選項(xiàng),利用函數(shù)支持的特性來實(shí)現(xiàn)的,為此得名 Functional Options Pattern,優(yōu)美的中國話叫做「函數(shù)選項(xiàng)模式」。

最后, 我們總結(jié)回顧一下在Go語言中函數(shù)選項(xiàng)模式的優(yōu)缺點(diǎn)


分享標(biāo)題:go語言參數(shù)設(shè)置 go語言chan
網(wǎng)頁地址:http://weahome.cn/article/ddopscd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部