Go语言不定长参数使用详解
不定长参数(Variadic Parameters)使用详解
核心概念
- 语法特性:
...T
表示函数可接受任意数量的T类型参数 - 底层实现:不定长参数在函数内部实际存储为切片类型
[]T
- 展开操作符:调用时使用
slice...
可将切片展开为独立参数
函数定义对比
// 不定长参数形式
func hello(nums ...int) {
fmt.Printf("类型:%T,值:%v\n", nums, nums) // 输出:类型:[]int,值:[1 2 3]
}
// 切片参数形式
func world(nums []int) {
fmt.Printf("类型:%T,值:%v\n", nums, nums) // 输出:类型:[]int,值:[1 2 3]
}
调用方式差异
调用场景 | hello(…int) | world([]int) |
---|---|---|
空参数 | hello() ✅ | world(nil) ⚠️ |
离散参数 | hello(1, 2, 3) ✅ | 不支持 ❌ |
直接传切片 | hello([]int{1,2,3}...) ✅ | world([]int{1,2,3}) ✅ |
空切片 | hello([]int{}...) ✅ | world([]int{}) ✅ |
关键注意事项
-
参数位置:不定长参数必须是函数的最后一个参数
func demo(a string, nums ...int) {} // 有效 func errorDemo(nums ...int, a string) {} // 编译错误
-
类型安全:所有参数必须匹配类型
hello(1, "2", 3) // 编译错误(类型不匹配)
-
空参数处理:
hello() // nums为nil切片(len=0, cap=0) world(nil) // 需要处理nil指针情况
实际应用场景
-
日志函数:
func Log(prefix string, messages ...string) { fmt.Printf("[%s] %v\n", prefix, strings.Join(messages, " ")) }
-
数学计算:
func Max(values ...int) int { if len(values) == 0 { return 0 } max := values[0] for _, v := range values { if v > max { max = v } } return max }
扩展特性
-
混合类型参数(需配合interface{}):
func PrintAll(values ...interface{}) { for _, v := range values { fmt.Printf("%v ", v) } } // 使用:PrintAll(42, "hello", 3.14)
-
切片转换技巧:
// 将普通切片转换为不定长参数 intSlice := []int{1, 2, 3} hello(intSlice...) // 等效于 hello(1, 2, 3)