本文系第十三篇Golang語言學習教程
可變參數函數
參數數量可變的函數,稱為可變參數函數。
最典型的例子就是fmt.Printf
和類似的函數。Print
首先接受一個必備的參數,之後接收任意個數的後續參數。
文法
如果函數的最後一個參數被記作...T
,那麼函數可以接受任意個T
類型的參數作為最後一個參數。
聲明可變函數
func sum(vals...int) int { //定義函數sum,vals被看作[]int類型的切片,sum可以接受任意數量的int型別參數 total := 0 for _, val := range vals{ //迴圈 vals 的值 total += val //將所有val加起來 } return total //返回任意個int型參數的和}
以上程式中,sum
函數返回任意個int
型參數的和
。vals
被看作[]int
類型的切片,sum
接收任意數量的int
型參數。
func main (){ fmt.Println(sum(1, 3, 5, 7)) // "16" fmt.Println(sum(1, 1, 1)) // "3" fmt.Println(sum()) // "0"}
以上程式調用sum
Function Compute輸入值得和。
來寫一個在輸入整數列表中查看某個整數是否存在的程式:
package mainimport "fmt"func find(num int, nums...int) { //定義函數find, 接受任意數量的int型參數 found := false //首先定義 found 為錯 for i, v := range nums { //迴圈 nums 的值 if v == num { fmt.Println(num, "found at index", i, "in", nums) found = true } //如果迴圈到的值等於 num 參數,則輸出位置,並且將found 置為true } if !found { fmt.Println(num, "is not in", nums) } //如果found 沒有被置為true,則表明沒有找到, 輸出沒有找到}func main (){ find(12, 5, 6, 12, 8, 9) find(4, 5, 6) find(67)}
在以上程式中,find函數接收任意數量的int型參數。
可變參數函數的工作原理是將可變參數轉換為一個新的切片,這是至關重要的。
在以上程式倒數第四行,find
函數中可變參數是5, 6, 12, 8, 9
,find 函數接收一個類型為int的可變參數。所以這五個參數被編譯器轉換為一個int類型切片 int []int{5, 6, 12, 8, 9}
,然後被傳入find函數中。
for迴圈遍曆nums
切片,如果num
在切片中,則輸出num
位置,如果不在則提示未找到。
以上代碼的輸出結果為:
12 found at index 2 in [5 6 12 8 9]
4 is not in [5 6]
67 is not in []
find
函數僅有一個參數也是合法的,這樣的情況下切片nums
是一個長度和容量都為0的nil
切片。
給可變參數傳入切片
之前說可變參數函數的工作原理是將可變參數轉換為一個新的切片,那麼以正常方式將切片傳入可變參數:
numbers := []int{5, 6, 7, 8} find(7, numbers)
find函數規定,find(num int, nums...int)
,傳入的可變參數只能是int類型的參數,所以直接將一個切片傳入會報錯cannot use numbers (type []int) as type int in argument to find
只需要在最後一個參數後加上省略符,就可以將切片傳給find
函數:
package mainimport "fmt"func find(num int, nums...int) { //定義函數find, 接受任意數量的int型參數 found := false //首先定義 found 為錯 for i, v := range nums { //迴圈 nums 的值 if v == num { fmt.Println(num, "found at index", i, "in", nums) found = true } //如果迴圈到的值等於 num 參數,則輸出位置,並且將found 置為true } if !found { fmt.Println(num, "is not in", nums) } //如果found 沒有被置為true,則表明沒有找到, 輸出沒有找到}func main (){ numbers := []int{5, 6, 7, 8} find(7, numbers...)}
以上為學習Golang 可變函數篇