如果函式的最後乙個引數是採用...type
的形式,那麼這個函式就可以處理乙個變長的引數,這個長度可以為 0,這樣的函式稱為變參函式。
func myfunc(a, b, arg ...int) {}
這個函式接受乙個類似某個型別的 slice 的引數(詳見第 7 章),該引數可以通過第 5.4.4 節中提到的 for 迴圈結構迭代。
示例函式和呼叫:
func greeting(prefix string, who ...string)
greeting("hello:", "joe", "anna", "eileen")
在 greeting 函式中,變數who
的值為string
。
如果引數被儲存在乙個 slice 型別的變數slice
中,則可以通過slice...
的形式來傳遞引數,呼叫變參函式。
示例 6.7 varnumpar.go
package main
import "fmt"
func main()
x = min(slice...)
fmt.printf("the minimum in the slice is: %d", x)
}func min(s ...int) int
min := s[0]
for _, v := range s
} return min
}
輸出:
the minimum is: 0
the minimum in the slice is: 1
練習 6.3varargs.go
寫乙個函式,該函式接受乙個變長引數並對每個元素進行換行列印。
乙個接受變長引數的函式可以將這個引數作為其它函式的引數進行傳遞:
func f1(s ...string)
func f2(s ...string)
func f3(s string)
變長引數可以作為對應型別的 slice 進行二次傳遞。
但是如果變長引數的型別並不是都相同的呢?使用 5 個引數來進行傳遞並不是很明智的選擇,有 2 種方案可以解決這個問題:
使用結構(詳見第 10 章):
定義乙個結構型別,假設它叫options
,用以儲存所有可能的引數:
type options struct
函式 f1 可以使用正常的引數 a 和 b,以及乙個沒有任何初始化的 options 結構:f1(a, b, options {})
。如果需要對選項進行初始化,則可以使用f1(a, b, options )
。
使用空介面:
如果乙個變長引數的型別沒有被指定,則可以使用預設的空介面inte***ce{}
,這樣就可以接受任何型別的引數(詳見第 11.9 節)。該方案不僅可以用於長度未知的引數,還可以用於任何不確定型別的引數。一般而言我們會使用乙個 for-range 迴圈以及 switch 結構對每個引數的型別進行判斷:
func typecheck(..,..,values … inte***ce{})
} }
GO語言 6 3 傳遞變長引數
myfunc a,b,arg int greeting prefix string,who string greeting hello joe anna eileen import fmt func main x min slice.fmt.printf the minimum in the sli...
golang傳遞變長引數
函式的最後乙個引數是.type type typ e的形式,說明這個函式可以處理變長引數,這個函式稱為變參函式。引數儲存在sli ce slice slic e型別的變數sli ce slice slic e中,則通過sli ce.slice.slice.來傳遞引數,呼叫函式。package mai...
c語言傳遞引數
1.標準資料型別,int char 等。如果c傳遞的是單個資料型別,會在被調函式中重新建立乙個物件。所以,無論我們在被調函式中怎麼修改,主調函式的值不會發生變化。2.陣列。當我們傳遞的引數是乙個陣列時,c傳遞的是陣列首元素的位址。所以當我們在被調函式中做修改了,主調函式的值也會變化。3.自定義資料型...