站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        golang如何傳不定參數(shù)

        golang如何傳不定參數(shù)

        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ǔ)言類(lèi)似;

        可變參數(shù)在函數(shù)中將轉(zhuǎn)換為對(duì)應(yīng)的[]Type類(lèi)型,所以我們可以像使用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ù)類(lèi)型相同的slice,而不能是其他類(lèi)型(沒(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類(lèi)型使用…運(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ù)類(lèi)型不匹配編譯失敗。

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

        讀了這篇文章,再加上一些簡(jiǎn)單的聯(lián)系,我相信你們一定也能掌握golang可變參數(shù)的使用。

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 精品亚洲成α人无码成α在线观看| 久久精品国产精品亚洲下载| 国产精品一区二区三区免费| 久久狠狠高潮亚洲精品| 精品国产综合区久久久久久| 国产精品视频久久久| 日韩精品区一区二区三VR| 精品国产亚洲男女在线线电影 | 精品在线免费观看| 欧美性videos高清精品| 亚洲国产精品视频| 久久www免费人成精品香蕉| 中文字幕精品视频| 国产精品成人va| 999精品视频这里只有精品| 国精品无码一区二区三区在线| 亚洲精品~无码抽插| 亚洲精品动漫人成3d在线| 色婷婷久久久SWAG精品| 精品亚洲欧美无人区乱码| 国产精品午夜一级毛片密呀| 99久久精品国产一区二区蜜芽| 欧美精品第欧美第12页| 先锋影音国产精品| 自怕偷自怕亚洲精品| 亚洲精品免费观看| 国产精品 91 第一页| 国产欧美日韩综合精品一区二区三区| 国产成人亚洲精品91专区手机 | 最新精品露脸国产在线 | 99热热久久这里只有精品68| 色偷偷888欧美精品久久久| 久久精品草草草| 久久99国产精品久久99果冻传媒| 国产精品污视频| 亚洲精品欧美综合在线| 国产成人精品综合在线观看| 精品久久久久中文字幕一区| 青青久久精品国产免费看| 亚洲精品无码专区在线播放| 四虎成人精品无码|