今天使用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