今天使用iota 發現一個問題,定義別名型別的時候 呼叫函式報錯,廢話不多說,我們看一段示例(關于iota的用法這里就不介紹了,手冊介紹滴比較詳細):
package mainimport "fmt"type Aliasint int // 定義int 的別名 為Aliasintconst ( 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.
怎么理解? 如果我們這樣,那就沒問題,繼續看:
package mainimport "fmt"//type Aliasint int // 定義int 的別名 為Aliasintconst ( 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)}
輸出:
01
我們看到不使用別名正常輸出,那么,使用別名如何呼叫函式傳參?
package mainimport "fmt"type Aliasint int // 定義int 的別名 為Aliasintconst ( AA Aliasint = iota //初始化 0 BB // 1 CC // 2)func test(m Aliasint) { fmt.Println(m) }func main() { m := AA test(m) test(110) // 常量會被編譯器自動轉換}
輸出:
0110
結論:自定義型別必須使用別名型別的變數名定義,因為此時別名型別被"覆寫了",繼續,我們看了下面這段代碼,相信大家也理解啦:
package mainimport "fmt"type Aliasint int // 定義int 的別名 為Aliasintconst ( 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)}
輸出:
099
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59780.html
標籤:Go
上一篇:Go 多變數賦值時注意事項
下一篇:go-redis
