Golang學習筆記-1.13 可變參數函數

來源:互聯網
上載者:User

本文系第十三篇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"}

以上程式調用sumFunction 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 可變函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.