Golang教程 (十二)變參函式

2021-08-03 16:49:40 字數 2019 閱讀 6681

原文:

這是本golang系列教程的第十二篇。

變參函式是指可以接受可變數量的引數的函式。

如果乙個函式的最後乙個引數由...t表示,則表示該函式可以接受任意數量的型別為t的引數。

請注意只有函式的最後乙個引數才能指定為可變引數。

讓我們來建立乙個自己的變參函式。我們將編寫乙個程式來判斷某個特定整數是否包含在某個整數列表中。

package main

import (

"fmt"

)func find(num int, nums ...int)

}if !found

fmt.printf("\n")

}func main()

上面的程式中,func find(num int, nums ...int)可以接受任意數量的引數。...int在內部表示為切片。在這裡nums的型別為int

第 10 行利用 range for 遍歷nums切片,如果找到num則列印num所在位置,否則列印沒有找到。

上面的程式輸出如下:

type

of nums is int

89 found at index

0in [89

9095]

type

of nums is int

45 found at index

2in [56

6745

90109]

type

of nums is int

78not found in [38

5698]

type

of nums is int

87not found in

在第 25 行,find只有乙個引數。我們沒有傳遞任何引數給nums ...int。這是合法的,(譯者注:如果沒有給可變引數傳遞任何值,則可變引數為 nil 切片

),在這裡nums是乙個nil切片,長度和容量都是0。

我們已經提到...t在內部表示為型別是t切片。如果真是這樣,可以傳遞乙個切片給可變引數嗎?讓我們從下面的例子中尋找答案:

package main

import (

"fmt"

)func find(num int, nums ...int)

}if !found

fmt.printf("\n")

}func main()

find(89, nums)

}

在第 23 行,我們沒有將若干數量的引數傳遞給find的最後乙個引數, 而是傳遞了乙個切片。這是非法的,我們不能傳遞乙個切片給可變引數。上面的程式將報錯:main.go:23: cannot use nums (type int) as type int in argument to find

這裡有乙個語法糖可以用來將切片傳遞給變參函式。可以在切片後面加...,這樣會將切片展開為其中的各個元素並將它們傳遞給變參函式。這樣該程式將正常工作。

上面的程式如果將第23行的find(89, nums)改為find(89, nums...),程式將通過編譯,並輸出如下:

type

of nums is int

89 found at index

0in [89

9095]

變參函式的介紹到此結束。感謝閱讀。

目錄

go語言學習 變參函式 十二

翻譯自 什麼是變參函式?變參函式是指可以接受可變數量的引數的函式。語法如果函式的最後乙個引數表示為.t,則該函式可以接受任意數量t型別引數。注意 必須是引數列表的最後乙個引數才可以指定為可變引數。通過示例來理解可變函式如何工作func slice type,elems type type讓我們建立自...

變參函式設計

變參函式的應用得比較少.輸出log資訊功能的函式演常會用到變參函式.什麼是變參函式?比如 printf 個數 d,總數 d a,b printf就是變參函式,因為其引數的個數不是固定的.變參函式一般用到下列巨集 va arg retrieve argument from list va end re...

變參函式剖析

變參函式定義形式如func type a,要求至少乙個固定引數,因為需要通過這個引數來確定究竟有多少個引數 以及引數的型別。windows中,變參函式用來獲取引數的幾個巨集定義如下。typedef char va list define addressof v v define intsizeof ...