這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
在很多語言中都提供了不定參數和函數重載以及函數式語言中得閉包來提高函數的靈活性。如果使用過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...)}
這裡我們看到的結果是,首先一個完整的list,然後是每個元素:
l聽is聽聽[a聽b]item:聽aitem:聽b
通過配合使用for...range可以遍曆不定參數v中得每個參數。這裡我們將不定參數類型設為string,因此只能接受若干的string 類型的參數。