Go语言通过...操作符支持可变参数函数,参数类型前加...且须位于参数列表末尾,如func sum(numbers ...int) int;内部numbers本质是[]int切片,可遍历或取长度;调用时可传任意数量参数,如sum(1, 2, 3);传切片需用...展开,如values...;可变参数前可有固定参数,如greet(prefix string, names ...string);常用于日志、字符串拼接、配置选项和数学运算等场景。

在Go语言中,处理可变数量的函数参数非常方便,通过使用...操作符可以定义可变参数函数。这类函数允许调用者传入任意数量的参数,提升了函数的灵活性和复用性。
可变参数的基本语法
Go中的可变参数通过在参数类型前加...来声明,且该参数必须是形参列表中的最后一个。
func sum(numbers ...int) int {
total := 0
for _, num := range numbers {
total += num
}
return total
}
这个函数可以接受0个或多个int类型的参数:
sum() // 返回 0
sum(1, 2) // 返回 3
sum(1, 2, 3) // 返回 6
可变参数的本质是切片
虽然调用时传入的是多个值,但在函数内部,numbers ...int实际上是一个[]int切片。
立即学习“go语言免费学习笔记(深入)”;
这意味着你可以像操作切片一样遍历、获取长度等:
func printInfo(names ...string) {
fmt.Printf("参数数量: %d\n", len(names))
for i, name := range names {
fmt.Printf("第%d个: %s\n", i+1, name)
}
}
传递切片到可变参数函数
如果你已经有一个切片,并想将其元素作为参数传入可变参数函数,需要使用...展开操作符。
例如:
values := []int{1, 2, 3, 4}
result := sum(values...) // 必须加 ... 展开切片
不能直接传values,否则会报类型不匹配错误,因为函数期望的是多个int,而不是一个[]int。
混合固定参数与可变参数
可变参数前面可以有固定参数,但可变参数必须放在最后。
func greet(prefix string, names ...string) {
for _, name := range names {
fmt.Println(prefix + ", " + name)
}
}
调用示例:
greet("Hello", "Alice", "Bob")
常见应用场景
可变参数常用于以下场景:
- 日志函数:支持输出多个值,如
log.Println(...interface{}) - 字符串拼接:类似
strings.Join([]string, sep)的封装 - 配置选项:接收多个选项函数(functional options 模式)
- 数学运算:求最大值、最小值、平均值等
基本上就这些。Go的可变参数设计简洁实用,理解其基于切片的本质后,使用起来就很自然了。










