溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

go語(yǔ)言實(shí)現(xiàn)傳不定參數(shù)的方法

發(fā)布時(shí)間:2020-06-16 09:58:25 來(lái)源:億速云 閱讀:411 作者:Leah 欄目:編程語(yǔ)言

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

golang的可變參數(shù)

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

理,我們看一下可變參數(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)與其他語(yǔ)言類似;

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

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

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

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

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

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

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

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

傳遞參數(shù)給帶有可變參數(shù)的函數(shù)有兩種形式,第一種與通常的參數(shù)傳遞沒(méi)有什么區(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,而不能是其他類型(沒(méi)錯(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的解包操作很像,沒(méi)錯(cuò),大部分情況下你可以把...運(yùn)算符當(dāng)做是golang的unpack操作,不過(guò)有幾點(diǎn)不同還是要注意

的:

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

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

你會(huì)見(jiàn)到這樣的報(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è)語(yǔ)法糖,它把前面的slice直接復(fù)制給可變參數(shù),而不是先解包成獨(dú)立的n個(gè)參數(shù)再傳

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

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

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

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

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

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

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

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

到此為止, 關(guān)于go語(yǔ)言實(shí)現(xiàn)傳不定參數(shù)的方法有了一個(gè)基礎(chǔ)的認(rèn)識(shí), 但是對(duì)于具體的使用方法還是需要多加鞏固和練習(xí),如果想了解更多相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊。!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI