go語言實(shí)現(xiàn)傳不定參數(shù)的方法-創(chuàng)新互聯(lián)

這篇文章為大家?guī)碛嘘P(guān)go語言實(shí)現(xiàn)傳不定參數(shù)的方法詳細(xì)介紹。大部分知識(shí)點(diǎn)都是大家經(jīng)常用到的,為此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)企業(yè)建站,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁中充分展現(xiàn),通過對客戶行業(yè)精準(zhǔn)市場調(diào)研,為客戶提供的解決方案。

golang的可變參數(shù)

可變參數(shù)就是一個(gè)占位符,你可以將1個(gè)或者多個(gè)參數(shù)賦值給這個(gè)占位符,這樣不管實(shí)際參數(shù)的數(shù)量是多少,都能交給可變參數(shù)來處

理,我們看一下可變參數(shù)的聲明:

func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)

可變參數(shù)使用name ...Type的形式聲明在函數(shù)的參數(shù)列表中,而且需要是參數(shù)列表的最后一個(gè)參數(shù),這點(diǎn)與其他語言類似;

可變參數(shù)在函數(shù)中將轉(zhuǎn)換為對應(yīng)的[]Type類型,所以我們可以像使用slice時(shí)一樣來獲取傳給函數(shù)的參數(shù)們;

有一點(diǎn)值得注意,golang的可變參數(shù)不需要強(qiáng)制綁定參數(shù)的出現(xiàn)。

舉個(gè)例子,我想在c語言中實(shí)現(xiàn)一個(gè)求和任意個(gè)整數(shù)的函數(shù)sum:

int sum(int num, ...) {
    // todo
}

我們只有先指定至少一個(gè)固定的形參(num)才能使用...可變參數(shù),在golang中是不需要這樣做的:

func sum(nums ...int) int {
    //todo
}

這也是golang語法簡潔的其中一個(gè)體現(xiàn)。

傳遞參數(shù)給...可變參數(shù)

傳遞參數(shù)給帶有可變參數(shù)的函數(shù)有兩種形式,第一種與通常的參數(shù)傳遞沒有什么區(qū)別,拿上一節(jié)的sum舉個(gè)例子:

sum(1, 2, 3)
sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

除了參數(shù)的個(gè)數(shù)是動(dòng)態(tài)變化的之外和普通的函數(shù)調(diào)用是一致的。

第二種形式是使用...運(yùn)算符以變量...的形式進(jìn)行參數(shù)傳遞,這里的變量必須是與可變參數(shù)類型相同的slice,而不能是其他類型(沒錯(cuò),

數(shù)組也不可以),看個(gè)例子:

numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
sum(numbers...) // 和sum(1, 2, 3, 4, 5, 6, 7, 8, 9. 10)等價(jià)

這種形式最常用的地方是在內(nèi)置函數(shù)append里:

result := []int{1, 3}
data := []int{5, 7, 9}
result = append(result, data...) // result == []int{1, 3, 5, 7, 9}

是不是和python的解包操作很像,沒錯(cuò),大部分情況下你可以把...運(yùn)算符當(dāng)做是golang的unpack操作,不過有幾點(diǎn)不同還是要注意

的:

第一,只能對slice類型使用...運(yùn)算符:

arr := [...]int{1, 2, 3, 4, 5}
sum(arr...) // 編譯無法通過

你會(huì)見到這樣的報(bào)錯(cuò)信息:

cannot use arr (type [5]int) as type []int in argument to sum

這是因?yàn)榭勺儏?shù)實(shí)際是個(gè)slice,...運(yùn)算符是個(gè)語法糖,它把前面的slice直接復(fù)制給可變參數(shù),而不是先解包成獨(dú)立的n個(gè)參數(shù)再傳

遞,這也是為什么我只說...運(yùn)算符看起來像unpack的原因。

第二個(gè)需要注意的地方是不能把獨(dú)立傳參和...運(yùn)算符混用,再看個(gè)例子:

slice := []int{2, 3, 4, 5}
sum(1, slice...) // 無法通過編譯

這次你會(huì)見到一個(gè)比較長的報(bào)錯(cuò):

too many arguments in call to sum
    have (number, []int...)
    want (...int)

這是和前面所說的原因是一樣的,...運(yùn)算符將不定參數(shù)直接替換成了slice,這樣就導(dǎo)致前一個(gè)獨(dú)立給出的參數(shù)不再算入可變參數(shù)的范圍

內(nèi),使得函數(shù)的參數(shù)列表從(...int)變成了(int, ...int),最終使得函數(shù)類型不匹配編譯失敗。

正確的做法也很簡單,不要混合使用...運(yùn)算符給可變參數(shù)傳參即可。

到此為止, 關(guān)于go語言實(shí)現(xiàn)傳不定參數(shù)的方法有了一個(gè)基礎(chǔ)的認(rèn)識(shí), 但是對于具體的使用方法還是需要多加鞏固和練習(xí),如果想了解更多相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊。!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文名稱:go語言實(shí)現(xiàn)傳不定參數(shù)的方法-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://bm7419.com/article40/igjeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈服務(wù)器托管、手機(jī)網(wǎng)站建設(shè)軟件開發(fā)、網(wǎng)站收錄、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作