Go 语言允许函数接受不定数量的参数,也称“可变参数”。这为构建灵活的函数提供了便利,常用于求和、拼接等操作。
一、语法格式
func 函数名(参数名 ...类型) 返回值类型 {
// 函数体
}
可变参数本质上是一个切片(slice),可以使用 for
或 range
遍历。
二、基础示例:求和函数
func sum(nums ...int) int {
total := 0
for _, v := range nums {
total += v
}
return total
}
fmt.Println(sum(1, 2, 3)) // 输出 6
fmt.Println(sum(5, 10, 15, 20)) // 输出 50
三、可变参数的传递机制
传入的是零个或多个参数:
fmt.Println(sum()) // 输出 0(空切片)
如果你已经有一个 []int
切片,可以通过 ...
传入:
nums := []int{2, 4, 6}
fmt.Println(sum(nums...)) // 输出 12
四、与固定参数混用
可变参数可以与固定参数组合使用,但必须放在参数列表最后:
func greet(name string, messages ...string) {
for _, msg := range messages {
fmt.Printf("%s: %s\n", name, msg)
}
}
greet("Alice", "早上好", "下午好", "晚安")
五、零参数情况的处理
如果调用时不传可变参数,函数仍能正常执行:
greet("Bob") // 不输出任何内容
六、可变参数是切片(slice)
你可以对它执行切片操作、获取长度等:
func debug(values ...int) {
fmt.Println("总共参数:", len(values))
fmt.Println("前两个参数:", values[:2])
}
debug(1, 2, 3, 4)
七、不能有多个可变参数
Go 不支持多个可变参数,以下写法是错误的:
// ❌ 错误写法
func wrong(a ...int, b ...string) {}
八、小结
特性 | 说明 |
参数类型 | func f(...type) 语法 |
调用方式 | f(1, 2, 3) 或 f(slice...) |
与固定参数组合 | 可变参数必须在最后 |
零参数调用 | 可以调用,如 f() |
实际类型 | 可变参数是一个切片 []type |
多个可变参数 | 不支持,只能定义一个 |
可变参数让你的函数更灵活,适合用于处理动态长度的数据列表。