如何在Golang中使用可变参数函数_传递任意数量参数示例

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
}

调用方式:

  • 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=5rest=[]int{2,9,1}。注意此时至少要传一个参数,否则编译报错。