今天使用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 Color in argument to test
}
报错的意思是:不能在参数中使用x(type int)作为类型Aliasint来测试
分析:因为int 被别名化了。使用额外同类型变量不被支持,为啥?因为 x := 1这里 x 被隐试定义为了int, 而int不再是所谓的"int",而是 Aliasint.
怎么理解? 如果我们这样,那就没问题,继续看:
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)
}
输出:
0 1
我们看到不使用别名正常输出。那么,使用别名如何调用函数传参?
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
结论:自定义类型必须使用别名类型的变量名定义,因为此时别名类型被"覆盖了"。继续,我们看了下面这段代码,相信大家也理解啦:
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