1. 可变参数(Variadic Parameters)

在函数声明中,... 可以用来表示函数接受可变数量的参数。这些参数被收集到一个切片中,并可以在函数体内进行处理。

例如,假设我们有一个函数 sum,它可以计算任意数量的整数之和:

func sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

在这个函数中,nums ...int 表示 sum 函数接受任意数量的 int 类型参数,并将它们收集到名为 nums 的切片中。

我们可以这样调用 sum 函数:

fmt.Println(sum(1, 2, 3))  // 输出 6
fmt.Println(sum(4, 5, 6, 7))  // 输出 22

2. 切片的展开(Slicing/Spreading)

在某些情况下,我们可能需要将一个切片的元素分别传递给函数,而不是将整个切片传递给函数。这时,... 可以用来展开切片。

例如,假设我们有一个函数 min,它返回一组整数中的最小值:

func min(nums ...int) int {
    if len(nums) == 0 {
        return 0
    }
    min := nums[0]
    for _, num := range nums {
        if num < min {
            min = num
        }
    }
    return min
}

现在,如果我们有一个整数切片 nums := []int{3, 1, 4, 1, 5},我们可以使用 ... 来展开切片并将其传递给 min 函数:

nums := []int{3, 1, 4, 1, 5}
fmt.Println(min(nums...))  // 输出 1

在这里,nums... 将切片 nums 展开为一组参数,并将其传递给 min 函数。