rah*_*mat 4 function variadic go
让我们说,我min()
(例如)我有一个可变函数来定义所提供的多个值的最小值.
如果调用者没有提供任何参数,我想暂停编译过程(因为这将是调用者中的错误,而不是我的函数中的错误).
怎么做?
icz*_*cza 10
调用具有可变参数并且不传递参数的函数由语言规范有效.所以你不能使它成为编译时错误.
但是,您可以修改函数的签名以使其具有非可变参数和可变参数,然后在不使用参数的情况下调用它确实是编译时错误:
func min(first int, rest ...int) int {
m := first
for _, v := range rest {
if v < m {
m = v
}
}
return m
}
Run Code Online (Sandbox Code Playgroud)
这将强制调用者传递至少1个参数,否则它将是编译时错误.这个min()
函数可以像这样调用:
min(1)
min(1, 2)
min(1, 2, -3)
Run Code Online (Sandbox Code Playgroud)
但是尝试在没有任何参数的情况下调用它会导致编译时错误:
min() // Error: not enough arguments in call to min
Run Code Online (Sandbox Code Playgroud)
如果您希望调用者至少传递2个参数:
func min(first, second int, rest ...int) int {
return 0 // Implement your logic here
}
Run Code Online (Sandbox Code Playgroud)
注意:
如果调用者只想传递1个参数,上面的示例也更有效,因为变量参数是在后台使用切片实现的,如果调用者只传递1个参数,则不必创建nil
切片,将传递切片(这可以通过打印来验证rest == nil
- 这将是true
).
潜在的缺点是,如果你有一个切片,你不能只是将它传递给函数,但你可以做以下事情:
s := []int{1, 2, -3}
fmt.Println(min(s[0], s[1:]...))
Run Code Online (Sandbox Code Playgroud)
传递第一个元素,并切片以传递其余部分并使用...
它作为variadic参数的值传递.不要忘记检查切片是否至少有1个元素,否则上面的代码在运行时会发生混乱.
试试Go Playground上的例子.
如果您不能或不想修改函数的签名,您唯一的选择是在运行时恐慌或退出应用程序,但在编译时不可能失败.
归档时间: |
|
查看次数: |
546 次 |
最近记录: |