在 go 语言中,定义可变参数函数的方法是在参数类型前加上 ...,该参数必须是最后一个参数,并在函数内部作为切片处理;例如 func sum(nums ...int) int 函数可用于接收任意数量的整数参数并求和;调用时可以直接传入多个值,如 sum(1, 2, 3),也可以传入一个展开的切片,如 sum(values...);若要合并两个切片后传入,可使用 append(a, b...)...;直接调用 sum() 相当于传入空切片,而 sum(nil...) 则传入 nil 切片,两者在函数内部可能有细微差别;此外,可变参数不仅限于基本类型,也可用于结构体、接口等复杂类型。

在 Go 语言中,可变参数函数是一个非常实用的功能,尤其是在处理不确定数量的输入参数时。你可能已经见过像
fmt.Println(...)这样的函数,它们可以接受任意数量的参数,这背后就是用了 Go 的可变参数机制。

如何定义一个可变参数函数?
在 Go 中定义一个可变参数函数非常简单,只需要在参数类型前加上
...即可。这个参数必须是最后一个参数,并且本质上会被当作切片来处理。

举个例子:
立即学习“go语言免费学习笔记(深入)”;
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}你可以这样调用它:

sum(1, 2, 3) // 返回 6 sum(5, 10, 15, 20) // 返回 50
注意:这里的
nums在函数内部其实就是一个
[]int类型的切片。
可变参数和切片之间的关系
既然可变参数在函数内部被当作切片处理,那我们也可以传入一个切片进去,但需要使用
...来“展开”这个切片。
比如:
values := []int{10, 20, 30}
result := sum(values...) // 注意这里的 ... 用法如果不加
...,Go 会报错,因为函数期望的是多个
int参数,而不是一个切片。
反过来也成立:如果你有一个固定数量的参数函数,就不能直接传入一个切片,除非手动解包或者改写函数为可变参数形式。
实际使用中的几个小技巧
-
组合多个参数函数
如果你想把两个切片合并后传给可变参数函数,可以先合并再展开:a := []int{1, 2} b := []int{3, 4} result := sum(append(a, b...)...) -
传递 nil 或空切片的区别
sum()
直接调用,不传任何参数,相当于传入了一个空切片。sum(nil...)
也是合法的,但这时传进去的是一个nil
切片,在函数内部可能会有细微差别(比如len(nums)
是 0,但底层数组为空)。
-
可变参数不限于基本类型
你也可以用结构体、接口甚至其他切片作为可变参数类型:func printStrings(strs ...string) { fmt.Println(strs) }
基本上就这些了。Go 的可变参数虽然简单,但在实际开发中非常常用,尤其是一些工具函数或日志打印相关的场景。只要记住它是以切片为基础实现的,就能灵活运用。










