可变参数(Variable Parameters),从字面意义上,我们就可以理解是应用在参数个数无法在编码过程中确定的场景下。其中fmt包下的Printf和Println函数是咱们常用到的可变参数的函数。
参数数量可变的函数称之为可变参数函数,主要是在使用语法糖"...type"(syntactic sugar)。
一、可变参数定义
可变参数就是一个占位符,你可以将1个或者多个参数赋值给这个占位符,这样不管实际参数的数量是多少,都能交给可变参数来处理,可变参数使用name ...Type的形式声明在函数的参数列表中,而且需要是参数列表的最后一个参数。也就是Golang可变参数本质上就是 slice。只能有一个,且必须是最后一个。来看一个例子:
func Printf(format string, a ...int) (n int, err error)
在函数中将转换为对应的[]Type类型,所以我们可以像使用slice时一样来获取传给函数的参数们(通过arg[index]依次访问所有参数,通过len(arg)来判断传递参数的个数)。这也是GO语法简洁的其中一个体现。
如果可变参数里每个参数的类型都不确定,那需要用到...interface{}。
func myfunc(args ...interface{}) { }
二、传递参数给可变参数
这里主要有两种形式:
- 与通常的参数传递没有什么区别,直接传递所有参数即可(这时会涉及一个内部自动将其转换为切片类型的过程)
sum(1, 2, 3)
sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
sum(numbers...)
//append
result := []int{1, 3}
data := []int{5, 7, 9}
// result == []int{1, 3, 5, 7, 9}
result = append(result, data...)
有两个需要注意的地方:
- 只能对slice类型使用...运算符
- 不能把独立传参和...运算符混用
//case one
arr := [...]int{1, 2, 3, 4, 5}
sum(arr...) // 编译无法通过
//cannot use arr (type [5]int) as type []int in argument to sum
//case two
slice := []int{2, 3, 4, 5}
sum(1, slice...) // 无法通过编译
这部分内容就总结到这里,Get了不?