是否有可能在golang中使用自定义库触发编译时错误?

时间:2016-05-17 08:20:36

标签: function go variadic

让我们说,我有min()(例如)一个可变函数来定义所提供的多个值中的最小值。

如果调用者没有提供任何参数,我想暂停编译过程(因为这将是调用者中的错误,而不是我的函数中的错误)。

怎么做?

1 个答案:

答案 0 :(得分:11)

调用具有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个参数,上面的例子也更有效,因为变量参数是在后台使用切片实现的,如果调用者只传递1个参数,则不需要创建切片,{我会传递{1}}切片(可以通过打印nil进行验证 - 这将是rest == nil)。

潜在的缺点是,如果你有一个切片,你不能将它传递给函数,但你可以做以下事情:

true

传递第一个元素,并切片以传递其余元素并使用s := []int{1, 2, -3} fmt.Println(min(s[0], s[1:]...)) 将其作为variadic参数的值传递。不要忘记检查切片是否至少有1个元素,否则上面的代码会在运行时发生恐慌。

尝试Go Playground上的示例。

如果您不想或不想修改您的功能的签名,您唯一的选择是在运行时恐慌或退出应用程序,但在编译时不可能失败。< / p>