Go 自定义类型来实现枚举类型限制

2019-12-08

今日运用iota 发现一个问题。界说别号类型的时分 调用函数报错。废话不多说,咱们看一段示例:

package main
import "fmt"
type aliasint int // 界说int 的别号 为aliasint
const  { fmt.println }
func main {
 m := aa
 test
 x := 1
 test
 // cannot use x  as type aliasint in argument to test
}

报错的意思是:不能在参数中运用x作为类型aliasint来测验

剖析:由于int 被别号化了。运用额定同类型变量不被支撑,为啥?由于 x := 1这儿 x 被隐试界说为了int, 而int不再是所谓的"int",而是 aliasint.
怎样了解? 假如咱们这样,那就没问题,持续看:


package main
import "fmt"
//type aliasint int // 界说int 的别号 为aliasint
const  { fmt.println }
func main {
 m := aa
 test
 x := 1
 test
}

输出:

0
1

咱们看到不运用别号正常输出。那么,运用别号怎么调用函数传参?

package main
import "fmt"
type aliasint int // 界说int 的别号 为aliasint
const  { fmt.println }
func main {
 m := aa
 test
 test // 常量会被编译器主动转化
}

输出:

0
110

定论:自界说类型有必要运用别号类型的变量名界说,由于此刻别号类型被"覆盖了"。持续,咱们看了下面这段代码,信任我们也了解啦:

package main
import "fmt"
type aliasint int // 界说int 的别号 为aliasint
const  { fmt.println }
func main {
 m := aa
 test
 var x aliasint
 x = 99
 test
}

输出:

0
99