调用具有variadic参数且不传递参数的函数由语言规范有效.所以你不能使它成为编译时错误.
但是,您可以修改函数的签名以使其具有非可变参数和可变参数,然后在没有参数的情况下调用它确实是编译时错误:
func min(first int,rest ...int) int { m := first for _,v := range rest { if v < m { m = v } } return m }
这将强制调用者传递至少1个参数,否则它将是编译时错误.这个min()函数可以像这样调用:
min(1) min(1,2) min(1,2,-3)
min() // Error: not enough arguments in call to min
如果您希望调用者至少传递2个参数:
func min(first,second int,rest ...int) int { return 0 // Implement your logic here }
注意:
如果调用者只想传递1个参数,上面的例子也更有效,因为variadic参数是在后台使用切片实现的,如果调用者只传递1个参数,则不需要创建切片,nil切片将是通过(这可以通过print rest == nil验证 – 这将是真的).
潜在的缺点是,如果你有一个切片,你不能只是将它传递给函数,但你可以做以下事情:
s := []int{1,-3} fmt.Println(min(s[0],s[1:]...))
传递第一个元素,并切片以传递其余元素并使用…将其作为variadic参数的值传递.不要忘记检查切片是否至少有1个元素,否则上面的代码在运行时会发生混乱.
试试Go Playground上的例子.