Go语言的可变参数允许函数接收不定数量的同类型参数,在实际开发中经常会遇到需要将一个函数的可变参数转发给另一个函数的场景,这就需要用到可变参数的展开语法。

Go语言可变参数的基本定义
可变参数的定义方式是在参数类型前加上省略号...,表示该函数可以接收零个或多个该类型的参数,可变参数在函数内部会被当作切片处理。
package main
import "fmt"
// 定义一个接收可变int参数的函数
func sum(nums ...int) {
total := 0
for _, num := range nums {
total += num
}
fmt.Println("总和:", total)
}
可变参数的转发与展开
当需要将一个函数的可变参数传递给另一个接收可变参数的函数时,不能直接传递切片,需要在切片后面加上省略号...实现参数展开,这个操作会将切片中的元素逐个作为独立参数传递。
基础转发场景
下面示例展示了一个包装函数将接收到的可变参数转发给内部的求和函数:
package main
import "fmt"
func sum(nums ...int) {
total := 0
for _, num := range nums {
total += num
}
fmt.Println("总和:", total)
}
// 包装函数,接收可变参数并转发给sum
func wrapper(nums ...int) {
// 使用...展开切片,将参数传递给sum
sum(nums...)
}
func main() {
wrapper(1, 2, 3) // 输出:总和: 6
wrapper(10, 20) // 输出:总和: 30
}
混合固定参数与可变参数的转发
如果函数除了可变参数还有固定参数,转发时需要先传递固定参数,再展开可变参数:
package main
import "fmt"
// 带固定前缀的可变参数函数
func printWithPrefix(prefix string, items ...string) {
fmt.Print(prefix + ": ")
for _, item := range items {
fmt.Print(item + " ")
}
fmt.Println()
}
// 转发函数,固定参数和可变参数分别传递
func forward(prefix string, items ...string) {
printWithPrefix(prefix, items...)
}
func main() {
forward("水果", "苹果", "香蕉", "橙子") // 输出:水果: 苹果 香蕉 橙子
}
常见注意事项
- 只有切片类型后面可以加
...进行展开,普通的多值不能直接展开,比如sum(1, 2, 3...)是错误语法。 - 可变参数必须放在函数参数列表的最后一位,否则会编译报错。
- 展开操作只会展开一层,如果切片的元素本身也是切片,不会进行递归展开。
总结
Go语言可变参数的转发和展开核心就是使用...语法,定义时用...type声明可变参数,转发时用slice...展开切片为独立参数。掌握这个语法可以大幅简化多函数间不定参数的传递逻辑,减少重复代码,提升开发效率。