为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容森 2022-01-10 16:55:34
假设,我有min()(例如)一个可变参数函数来定义提供的多个值中的最小值。如果调用者没有提供任何参数,我想停止编译过程(因为这将是调用者中的错误,而不是我的函数中的错误)。怎么做?
查看完整描述

1 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

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


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


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


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


s := []int{1, 2, -3}

fmt.Println(min(s[0], s[1:]...))

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


试试Go Playground上的示例。


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


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号