5.6.1.2. 可变参数函数
可变参数函数是其最后一个(或仅有的一个)参数可以接受零个或多个参数的函数。这些函数是通过在最后一个或仅有的一个参数类型之前放置省略号(…)来表示的,在函数内部,该参数的类型是给定类型的切片。例如,如果有一个函数Join(xs …string) string,参数xs的类型则为[]string。下面的例子演示了可变参数函数的使用;函数的作用是返回给定int类型参数的最小值。我们将从函数的调用和输出开始介绍。
1 2 3 | fmt.Println(MinimumInt1(5, 3), MinimumInt1(7, 3, -2, 4, 0, -8, -5)) 3 -8 |
MinimumInt1()函数接受一个或多个int类型的值并返回其最小值。
1 2 3 4 5 6 7 8 | func MinimumInt1(first int, rest ...int) int { for _, x := range rest { if x < first { first = x } } return first } |
我们也可以很容易的实现接受最小零个参数的函数,如MinimumInt0(ints …int);或者至少两个参数的函数,如MinimumInt2(first,second int, rest…int)。
如果我们有一个int类型的切片,依旧可以使用MinimumInt1()函数来获得其最小值。
1 2 3 4 | numbers := []int{7, 6, 2, -1, 7, -3, 9} fmt.Println(MinimumInt1(numbers[0], numbers[1:]...)) -3 |
MinimumInt1()函数需要一个int类型的值和零个或多个附加的int类型的值。当调用可变参数函数或方法时,我们可以在切片后面放置一个省略号,这样可以有效地将切片转换为一个参数序列,且每个参数对应于切片中的项。(之前我们在讨论内置的append()函数时已做了介绍。)所以,这里我们将numbers[1:]转换为单独的参数6, 2, -1, 7, -3, 9,这些数据就存储在rest切片中。如果我们刚才实现了提到的MinimumInt0()函数,我们可以将对函数的调用简化为MinimumInt0(numbers…)。