栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

调用具有可变参数且不传递任何参数的函数在语言规范中有效。因此,您不能使其成为编译时错误。

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

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

如果您希望调用者传递至少两个参数:

func min(first, second int, rest ...int) int {    return 0 // Implement your logic here}

注意:

如果调用方只想传递1个参数,则上面的示例也更加有效,因为可变参数是在后台使用slice实现的,并且如果调用方仅传递1个参数,则无需创建任何

nil
slice,将传递一个slice
(这可以通过打印进行验证
rest == nil
-将是
true
)。

潜在的不利之处在于,如果您有一个分片,您不仅可以将其传递给函数,还可以执行以下操作:

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

它正在传递第一个元素,并对切片进行切片以传递其余部分,并使用

...
它作为可变参数的值传递。不要忘记检查分片是否至少包含1个元素,否则上面的代码在运行时会出现问题。

在Go Playground上尝试示例。

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436164.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号