可变参数
- 参数数量可变的函数称为可变参数函数
- 在声明可变参数函数时,需要在参数列表的最后一个参数类型之前加上省略符号"···",这表示该函数会接收任意数量的该类型参数。
func sum(values...int) {
total := 0
for _, value := range values {
total += value
}
return total
}
- 上面的sum函数返回任意个int参数的和。
- 在函数体中,values被看做是类型为 []int 的切片。sum函数可以接收任意个数量的int参数
fmt.Println(sum()) //"0"
fmt.Println(sum(3)) //"3"
fmt.Println(sum(1,2,3,4)) //"10"
- 上面的代码中,调用者隐式地创建一个数组,并将原始参数复制到数组中,再把数组的一个切片作为参数传给被调用函数。
- 如果原始参数已经是切片类型,我们该如何传递给sum?只需要在最后一个参数后加上省略号。
values := []int{1,2,3,4}
fmt.Println(sum(values...)) //"10"
- 虽然在可变参数函数内部,···int 型参数的行为看起来很像切片类型,但是实际上,可变参数函数和以切片作为参数的函数是不同的。
func f(...int) {}
func g([]int) {}
fmt.Println("%T\n", f) //"func(...int)"
fmt.Println("%T\n", g) //"func([]int)"