仅允许Go中常量组的值
假设我有一个函数,它把一个仅允许Go中常量组的值,go,types,Go,Types,假设我有一个函数,它把一个int作为参数。我希望此函数只接受值0、1或2。如果我不必手动检查并返回错误,或者处理函数中的其他值,而是在编译时检查它以避免不必要的错误,那就太好了 // should only accept 0, 1 or 2 func foo(bar int) { fmt.Println(bar) } 现在为了做到这一点,我定义了自己的类型和3个常量值: type MyType int const ( Zero MyType = iota One
int
作为参数。我希望此函数只接受值0、1或2。如果我不必手动检查并返回错误
,或者处理函数中的其他值,而是在编译时检查它以避免不必要的错误,那就太好了
// should only accept 0, 1 or 2
func foo(bar int) {
fmt.Println(bar)
}
现在为了做到这一点,我定义了自己的类型和3个常量值:
type MyType int
const (
Zero MyType = iota
One
Two
)
现在我可以修改我的函数以接受MyType而不是int:
func foo(bar MyType) {
fmt.Println(bar)
}
我可以用三个常数中的任意一个来调用它:
foo(Zero) // would print 0
foo(One) // would print 1
foo(Two) // would print 2
而且,它不能用int
而不是MyType
i := 5
foo(i) // errors
它在编译时返回以下错误:不能在foo的参数中使用i(type int)作为类型MyType。这正是我想要的。但是仍然可以调用该函数,如下所示:
foo(5) // works and prints 5
因为它从参数(实际上是int的MyType)推断类型,所以在传递非类型化参数时,它会自动将其转换为MyType
那么,有没有办法定义一个只允许3个已定义常量中的一个的函数
那么,有没有办法定义一个只允许3个已定义常量中的一个的函数
不,没有
嗯,你可以用函数或接口类型来做一些难看的黑客攻击,但这不值得付出努力
那么,有没有办法定义一个只允许3个已定义常量中的一个的函数
不,没有
嗯,你可以用函数或接口类型来做一些难看的黑客攻击,但这不值得付出努力