今天使用iota 发现一个问题。定义别名类型的时候 调用函数报错。废话很少说,咱们看一段示例(关于iota的用法这里就不介绍了,手册介绍滴比较详细):函数
package main import "fmt" type Aliasint int // 定义int 的别名 为Aliasint const ( AA Aliasint = iota //初始化 0 BB // 1 CC // 2 ) func test(m Aliasint) { fmt.Println(m) } func main() { m := AA test(m) x := 1 test(x) // cannot use x (type int) as type Aliasint in argument to test }
报错的意思是:不能在参数中使用x(type int)做为类型Aliasint来测试测试
分析:由于int 被别名化了。使用额外同类型变量不被支持,为啥?由于 x := 1这里 x 被隐试定义为了int, 而int再也不是所谓的"int",而是 Aliasint.
怎么理解? 若是咱们这样,那就没问题,继续看:spa
package main import "fmt" //type Aliasint int // 定义int 的别名 为Aliasint const ( AA int = iota //初始化 0 BB // 1 CC // 2 ) func test(m int) { fmt.Println(m) } func main() { m := AA test(m) x := 1 test(x) }
输出:code
0 1
咱们看到不使用别名正常输出。那么,使用别名如何调用函数传参?blog
package main import "fmt" type Aliasint int // 定义int 的别名 为Aliasint const ( AA Aliasint = iota //初始化 0 BB // 1 CC // 2 ) func test(m Aliasint) { fmt.Println(m) } func main() { m := AA test(m) test(110) // 常量会被编译器自动转换 }
输出:编译器
0 110
结论:自定义类型必须使用别名类型的变量名定义,由于此时别名类型被"覆盖了"。继续,咱们看了下面这段代码,相信你们也理解啦:io
package main import "fmt" type Aliasint int // 定义int 的别名 为Aliasint const ( AA Aliasint = iota //初始化 0 BB // 1 CC // 2 ) func test(m Aliasint) { fmt.Println(m) } func main() { m := AA test(m) var x Aliasint x = 99 test(x) }
输出:编译
0 99