可变参数,其实我觉得更应该称呼为 数量不固定参数,不过大家都这么称呼,那就还是用原来的吧。
可变参数 的需求,只有一个用户,就是 传递给函数的参数数量未知的,可能传一个,也可能多个,也可能一个都不传。
我以前很傻的以为: 那我为了预防未来的不确定性,我可以用多定义几个参数,先放着,用得着的时候再用就是了。
现在想想真幼稚:
- 未来谁也说不定,可能认为一个就好,但是要用的时候可能一个就不够了。
- 参数的类型,可能定义的时候是
int
,用的时候可能就是string
了。
所以啊,可变参数 能不用则不用,实在没办法了就用吧。
使用语法
声明可变参数
func SumOf(nums ...interface{}){} // 数据类型未知 func SumOf(nums ...int8){} // 数据类型为 int8 func Greeting(prefix string, who ...string) // 必须是最后一个参数
可变参数类型的声明和普通参数的声明,唯二的区别就是:
- 类型前面多了三个点
...
- 可变参数类型要在参数函数的末尾,比如
func SumOf(nums ...int8,op string){}
这样就不行了。
使用声明后的可变参数
可变参数 在函数内,其实是一个 slice
,类型相当于切片类型 []T
,比如上面的
func SumOf(nums ...interface{}){} // 相当于 []interface{} func SumOf(nums ...int8){} // 相当于 []int8 func Greeting(prefix string, who ...string) //相当于 []string
既然可变参数的效果等价于 []T
,那么我们就可以当作 切片 类型来使用
func SumOf(nums ...int8) { sum := 0 for _, num := range nums { sum += int(num) } println(sum) }
可变参数如何传参
根据可变参数原本的意思,可变参数的传参数可以普通的一个一个参数的传,比如
SumOf(1, 2, 3, 34, 5) SumOf(1, 2, 3) SumOf(1, 3) SumOf(1)
另外一种传参方法就是传递切片给它,比如
nums := []int8{1, 2, 3, 5, 6, 11} SumOf(nums...)
当然了,这种传参方法要注意的是,**三个点 ...
要放在参数的后面。
其实现代编辑器,也不用死记硬背在哪里,如果放在前面错了,就放后面好了,总之要记住一定要三个点就是了
范例代码
上面的所有范例代码,汇总如下
package main func SumOf(nums ...int8) { sum := 0 for _, num := range nums { sum += int(num) } println(sum) } func main() { SumOf(1, 2, 3, 34, 5) SumOf(1, 2, 3) SumOf(1, 3) SumOf(1) nums := []int8{1, 2, 3, 5, 6, 11} SumOf(nums...) }
目前尚无回复