變參函數:
函數中形式參數的數目通常是確定的,在調用的時候要依次傳入與形式參數對應的所有實際參數,但是在某些函數的參數個數可以根據實際需要來確定,這就是變參函數。
Go語言支持不定長變參,但是要注意不定長參數只能作為函數的最后一個參數,不能放在其他參數的前面。函數的聲明如下:
Func functionName(variableArgumentName ... dateType) 返回值{
Body
}
不定長變參的實質就是一個切片,可以使用range遍歷,例如:
Func f(args ...int){
For _,arg :=range args{
fmt.Println(arg)
}
}
我們熟知的fmt.Print()函數可以傳遞不同類型的參數,go語言規定,如果希望傳遞任意類型的變參,變參類型應該制定為空接口類型:interface{}.例如:
Func f(args ... Interface{}){
...
}
Go語言中,空接口可以指向任何數據對象,所以可以使用interface{}定義任意類型變量,同時interface{}也是類型安全的。
例:
package main
import (
"fmt"
)
func main() {
f(2, "Go", 8, "language", 'a', false, 'A', 3.14)
}
func f(args ...interface{}) {
var num = make([]int, 0, 6)
var str = make([]string, 0, 6)
var ch = make([]int32, 0, 6)
var other = make([]interface{}, 0, 6)
for _, arg := range args {
switch v := arg.(type) {
case int:
num = append(num, v)
case string:
str = append(str, v)
case int32:
ch = append(ch, v)
default:
other = append(other, v)
}
}
fmt.Println(num)
fmt.Println(str)
fmt.Println(ch)
fmt.Println(other)
}
輸出:
[2 8]
[Go language]
[97 65]
[false 3.14]
變參函數難度不大,多理解理解,跟着寫寫,然后自己嘗試些幾個變參函數就可以了