加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 19:21:12 所属栏目:大数据 来源:网络整理
导读:比方说,我有min()(例如)一个可变函数来定义提供的多个值的最小值. 如果调用者没有提供任何参数,我想暂停编译过程(因为这将是调用者中的错误,而不是我的函数中的错误). 怎么做? 调用具有variadic参数且不传递参数的函数由语言规范有效.所以你不能使它成为编
比方说,我有min()(例如)一个可变函数来定义提供的多个值的最小值.

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

怎么做?

调用具有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上的例子.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读