【问题标题】:Is it possible to trigger compile time error with custom library in golang?是否可以在 golang 中使用自定义库触发编译时错误?
【发布时间】:2016-09-13 05:39:57
【问题描述】:

假设,我有 min()(仅作为示例)一个可变参数函数,用于从提供的多个值中定义最小值。

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

怎么做?

【问题讨论】:

    标签: function go variadic


    【解决方案1】:

    调用具有可变参数且不传递任何参数的函数在语言规范中是有效的。所以你不能让它成为编译时错误。

    但是,您可以将函数的签名修改为具有非可变参数可变参数,然后在不带参数的情况下调用它确实会导致编译时错误:

    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 个参数,则不必创建切片,@ 987654327@ 切片将被传递(这可以通过打印 rest == nil 来验证 - 这将是 true)。

    潜在的缺点是,如果你有一个切片,你不能只将它传递给函数,但你可以执行以下操作:

    s := []int{1, 2, -3}
    fmt.Println(min(s[0], s[1:]...))
    

    这是传递第一个元素,切片切片以传递其余元素,并使用... 将其作为可变参数的值传递。不要忘记检查 slice 是否至少有 1 个元素,否则上面的代码会在运行时崩溃。

    尝试Go Playground 上的示例。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2010-10-19
      • 2010-09-27
      相关资源
      最近更新 更多