是否可以使用 golang 中的自定义库触发编译时错误?
Is it possible to trigger compile time error with custom library in golang?
比方说,我有 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
如果您希望调用者至少传递 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 上的示例。
如果您不能或不想修改函数的签名,您唯一的选择是在运行时崩溃或退出应用程序,但不可能在编译时失败。
比方说,我有 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
如果您希望调用者至少传递 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 上的示例。
如果您不能或不想修改函数的签名,您唯一的选择是在运行时崩溃或退出应用程序,但不可能在编译时失败。