天天看點

Golang的不定參數

在很多語言中都提供了不定參數和函數重載以及函數式語言中得閉包來提高函數的靈活性。如果使用過fmt包裡的函數,那麼你就已經接觸到了Golang的不定參數了。那麼如何定義一個自己的不定參數的函數呢?

一、函數定義

首先來看如何定義一個不定參數的函數:

func YourFun(v... interface{}){
}      

該函數定義,定義了一個接受任何數目任何類型參數的函數。這裡特殊的文法是三個點“...”,在一個變量後面加上三個點後,表示從該處開始接受不定參數,不同于python,golang的不定參數如果将這裡"interface{}" 替換成某一确定類型,那麼其就隻能接受該類型的不定參數。

二、三個點

上面我們看到有三個點"..."的特殊标記。那麼這三個點"..."有啥作用呢?

2.1 不定參數

如上所述,在定義不定參數時,表示從該參數開始記錄不定參數

2.2 解引用slice

當要傳遞若幹個值到不定參數函數中得時候,可以手動書寫每個參數,也可以将一個slice傳遞給該函數:

    YourFunc (YourSlice...)      

通過"..."可以将slice中得參數對應的傳遞給函數。相當于python中得“*args”

這裡要注意的是,解引用slice目前隻能在不定參數函數傳遞參數時使用,在其他地方使用會報錯。

三、周遊參數

下面我們來看一個執行個體:

func P (v... string) {
for _,item := range v {
    fmt.Println("item:",item)
    }
}

func main() {

    var l []string
    l = append(l,"a")
    l = append(l,"b")
    fmt.Println("l is ",l)
    P(l...)
}      
l is  [a b]
item: a
item: b