Go语言的可变参数函数是指可以接收零个或多个同类型参数的函数,这种特性在处理参数数量不确定的场景时非常实用,比如需要计算多个数值的和、拼接多个字符串等场景都可以用可变参数函数简化实现。

可变参数函数的定义语法
Go语言中定义可变参数函数时,需要在参数类型前加上省略号...,语法格式如下:
// 函数名(可变参数名 ...参数类型) 返回值类型
func 函数名(参数名 ...类型) 返回值类型 {
// 函数体
}
可变参数在函数内部会被当作对应类型的切片来处理,因此可以直接使用切片的相关操作处理传入的参数。
基础定义示例
下面是一个计算多个整数之和的可变参数函数示例:
package main
import "fmt"
// 计算多个整数的和,参数nums是可变参数,类型为int
func sum(nums ...int) int {
total := 0
// 遍历可变参数,这里的nums本质是[]int类型的切片
for _, num := range nums {
total += num
}
return total
}
func main() {
// 传入3个参数调用
result1 := sum(1, 2, 3)
fmt.Println(result1) // 输出6
// 传入5个参数调用
result2 := sum(10, 20, 30, 40, 50)
fmt.Println(result2) // 输出150
// 不传入参数调用
result3 := sum()
fmt.Println(result3) // 输出0
}
可变参数函数的使用场景
直接传入多个零散参数
这是最常见的使用方式,直接把多个同类型的参数依次传入函数即可,函数会自动把这些参数收集到可变参数对应的切片中。
传入切片作为可变参数
如果已经有一个同类型的切片,想要把它作为可变参数传入函数,需要在切片后面加上省略号...,把切片展开为多个参数。
package main
import "fmt"
func printNames(names ...string) {
for _, name := range names {
fmt.Println(name)
}
}
func main() {
nameSlice := []string{"张三", "李四", "王五"}
// 传入切片时需要加...展开
printNames(nameSlice...)
// 也可以混合传入零散参数和展开的切片
printNames("赵六", nameSlice...)
}
可变参数与其他固定参数结合
可变参数必须放在函数参数列表的最后一位,前面可以定义固定参数,调用时需要先传入固定参数,再传入可变参数。
package main
import "fmt"
// prefix是固定参数,suffixes是可变参数
func formatString(prefix string, suffixes ...string) string {
result := prefix
for _, suffix := range suffixes {
result += suffix
}
return result
}
func main() {
// 先传固定参数,再传可变参数
str := formatString("hello_", "go", "lang", "user")
fmt.Println(str) // 输出hello_golanguser
}
使用可变参数函数的注意事项
- 可变参数只能有一个,并且必须是参数列表的最后一个,否则会编译报错。
- 在函数内部,可变参数的类型是切片,因此不能直接把它当作切片传递给另一个可变参数函数,需要先展开。
- 如果可变参数类型是
interface{},可以传入不同类型的参数,这是Go语言中很多格式化函数的实现基础,比如fmt.Println就是接收...interface{}类型的可变参数。
package main
import "fmt"
func printAny(args ...interface{}) {
for _, arg := range args {
fmt.Printf("类型:%T,值:%vn", arg, arg)
}
}
func main() {
// 可以传入不同类型的参数
printAny(1, "hello", 3.14, true)
}
掌握可变参数函数的定义和使用,可以让Go代码的编写更加灵活,减少重复的参数处理逻辑,在工具函数、通用逻辑封装场景中非常实用。