Is it possible to trigger compile time error with custom library in golang?

雨燕双飞 提交于 2019-11-28 13:57:42

Calling a function which has variadic parameter and passing no arguments is valid by the language spec. So you can't make it a compile-time error.

However, you may modify the signature of your function to have a non-variadic and a variadic parameter, and then calling it with no arguments would indeed be a compile-time error:

func min(first int, rest ...int) int {
    m := first
    for _, v := range rest {
        if v < m {
            m = v
        }
    }
    return m
}

This will force callers to pass at least 1 argument, else it will be a compile-time error. This min() function can be called like this:

min(1)
min(1, 2)
min(1, 2, -3)

But attempting to call it without any arguments results in compile-time error:

min() // Error: not enough arguments in call to min

If you want the callers to pass at least 2 arguments:

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

Note:

The above example is also more efficient if the caller just wants to pass 1 argument, as variadic parameters are implemented with slices in the background, and if the caller passes only 1 argument, no slice will have to be created, a nil slice will be passed (this can be verified by printing rest == nil – which will be true).

The potential downside is that if you have a slice, you can't just pass it to the function, but you may do the following:

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

Which is passing the first element, and slicing the slice to pass the rest and using ... to pass it as the value for the variadic parameter. Don't forget to check if the slice has at least 1 element, else the above code panics at runtime.

Try the examples on the Go Playground.

If you can't or don't want to modify the signature of your function, your only option is to panic or exit from the app at runtime, but no possibility to fail at compile-time.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!