当前位置: 首页 > 面试题库 >

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

马业
2023-03-14
问题内容

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

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

怎么做?


问题答案:

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

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

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个参数,则无需创建任何nilslice,将传递一个slice
(这可以通过打印进行验证rest == nil-将是true)。

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

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

它正在传递第一个元素,并对切片进行切片以传递其余部分,并使用...它作为可变参数的值传递。不要忘记检查分片是否至少包含1个元素,否则上面的代码在运行时会出现问题。

在Go Playground上尝试示例。

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



 类似资料:
  • 问题内容: 我有一些需要经常打印的结构。现在,我正在围绕该结构使用经典的打印包装器: 此功能很方便,但实际上也很有限。如果不进行新包装,则无法添加或添加一些文本。我知道我可以使用 va_arg 系列添加或添加一些文本,但是我觉得我会重新实现。 我想知道是否有可能向printf编写自定义函数。我希望能够写这样的东西: 这可能吗 ?我怎样才能做到这一点 ? 注意:我在Ubuntu Linux 10.0

  • 问题内容: 是否可以为javac(或某些替代的Java编译器)指定自定义类加载器? 我很喜欢这种壮举,因为它可以让我编译使用仅由我的特殊类加载器找到的类的类。 对于那些好奇的人:我将编写一个连接数据库的classloder,并根据找到的表创建类。 问题答案: 运行javac时,您可以像这样指定类加载器:

  • 目前,不允许在接口中使用get/set方法(访问器)。例如: 此外,TypeScript 不允许在类方法中使用数组函数表达式:例如: 有没有其他方法可以在接口定义上使用getter和setter?

  • 问题内容: 在数学课上,我们学习了如何定义新的运算符。例如: 这定义了法律。对于x和y的任何实数,x y是x + 2y。 范例:。 可以在JavaScript中定义这样的运算符吗?我知道函数可以胜任: 但我想使用以下语法: 代替这个: 哪个是最接近这个问题的解决方案? 问题答案: 最简洁的答案是不。ECMAScript(标准JS所基于的)不支持运算符重载。 可以使用sweet.js之类的第三方工具

  • 我们应该使用camunda生成的表单和camunda的tasklist和admin屏幕,还是应该开发自定义UI。 如果我们开发自定义用户界面,好处是我们将获得类似于我们的其他企业应用程序的屏幕布局。同时,我们也会整合现有系统中的流程,例如:HR可以登录企业HRM应用程序和入围应用程序,而不是登录camunda进行入围。 然而,开发自定义UI的缺点是,如果我改变图表中的流程来添加一个新的用户任务,我

  • 我的一个bluemix应用程序工作了几个星期,但当将应用程序推到bluemix时,它开始报告解析错误:: 下面是我的文件: