中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言實現傳不定參數的方法

發布時間:2020-06-16 09:58:25 來源:億速云 閱讀:419 作者:Leah 欄目:編程語言

這篇文章為大家帶來有關go語言實現傳不定參數的方法詳細介紹。大部分知識點都是大家經常用到的,為此分享給大家做個參考。一起跟隨小編過來看看吧。

golang的可變參數

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

理,我們看一下可變參數的聲明:

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

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

可變參數在函數中將轉換為對應的[]Type類型,所以我們可以像使用slice時一樣來獲取傳給函數的參數們;

有一點值得注意,golang的可變參數不需要強制綁定參數的出現。

舉個例子,我想在c語言中實現一個求和任意個整數的函數sum:

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

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

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

這也是golang語法簡潔的其中一個體現。

傳遞參數給...可變參數

傳遞參數給帶有可變參數的函數有兩種形式,第一種與通常的參數傳遞沒有什么區別,拿上一節的sum舉個例子:

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

除了參數的個數是動態變化的之外和普通的函數調用是一致的。

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

數組也不可以),看個例子:

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)等價

這種形式最常用的地方是在內置函數append里:

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

是不是和python的解包操作很像,沒錯,大部分情況下你可以把...運算符當做是golang的unpack操作,不過有幾點不同還是要注意

的:

第一,只能對slice類型使用...運算符:

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

你會見到這樣的報錯信息:

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

這是因為可變參數實際是個slice,...運算符是個語法糖,它把前面的slice直接復制給可變參數,而不是先解包成獨立的n個參數再傳

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

第二個需要注意的地方是不能把獨立傳參和...運算符混用,再看個例子:

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

這次你會見到一個比較長的報錯:

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

這是和前面所說的原因是一樣的,...運算符將不定參數直接替換成了slice,這樣就導致前一個獨立給出的參數不再算入可變參數的范圍

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

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

到此為止, 關于go語言實現傳不定參數的方法有了一個基礎的認識, 但是對于具體的使用方法還是需要多加鞏固和練習,如果想了解更多相關內容,請關注億速云行業資訊。!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丽水市| 綦江县| 宜川县| 厦门市| 浙江省| 石河子市| 金秀| 遂溪县| 汶上县| 三原县| 安庆市| 和平县| 新河县| 牡丹江市| 县级市| 龙门县| 彰化县| 南丰县| 平南县| 习水县| 文山县| 屏山县| 易门县| 山阳县| 麟游县| 电白县| 高州市| 宜春市| 新乐市| 中江县| 江陵县| 大兴区| 中宁县| 化州市| 崇文区| 临沧市| 太谷县| 黔江区| 溧水县| 桂东县| 宕昌县|