Go语言通过...语法支持可变参数函数,参数声明为Type...形式,实际传入时自动封装为切片;可变参数须位于参数列表末尾且最多一个,调用时可用slice...展开已有切片。

Go 语言通过 ... 语法支持可变参数(variadic functions),允许函数接收零个或多个同类型参数。关键在于参数声明时使用 Type... 形式,实际传入的参数会被自动封装为一个切片。
定义可变参数函数
语法格式为:func name(args ...Type) { ... }。其中 args 在函数体内是 []Type 类型,可像普通切片一样遍历、切片或传递给其他函数。
- 可变参数必须放在参数列表末尾,且最多只能有一个
- 即使不传参,
args也不是nil,而是长度为 0 的空切片 - 若已有切片变量,需用
slice...展开后传入(不能直接传切片)
基础用法示例:求和与拼接
以下函数分别演示数值累加和字符串连接:
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
func join(sep string, parts ...string) string {
if len(parts) == 0 {
return ""
}
result := parts[0]
for _, p := range parts[1:] {
result += sep + p
}
return result
}
调用方式:
立即学习“go语言免费学习笔记(深入)”;
免费 盛世企业网站管理系统(SnSee)系统完全免费使用,无任何功能模块使用限制,在使用过程中如遇到相关问题可以去官方论坛参与讨论。开源 系统Web代码完全开源,在您使用过程中可以根据自已实际情况加以调整或修改,完全可以满足您的需求。强大且灵活 独创的多语言功能,可以直接在后台自由设定语言版本,其语言版本不限数量,可根据自已需要进行任意设置;系统各模块可在后台自由设置及开启;强大且适用的后台管理支
-
sum(1, 2, 3)→ 返回6 -
sum()→ 返回0(空切片遍历不执行循环) -
join("-", "a", "b", "c")→ 返回"a-b-c"
传入已有切片:使用 ... 展开
当参数已存在切片中,需在调用时加 ... 将其元素逐个展开:
nums := []int{10, 20, 30}
fmt.Println(sum(nums...)) // ✅ 正确:展开为 sum(10, 20, 30)
// fmt.Println(sum(nums)) // ❌ 错误:类型不匹配,期望 int,得到 []int
这相当于把切片“打散”成独立参数,是 Go 处理批量数据传参的标准做法。
混合固定参数与可变参数
可变参数前可有其他固定参数,常用于指定操作符、分隔符等:
func max(first int, rest ...int) int {
m := first
for _, v := range rest {
if v > m {
m = v
}
}
return m
}
调用:max(5, 2, 9, 1) 中 first=5,rest=[]int{2,9,1}。注意此时至少要传一个参数,否则编译报错。









