Go 自定義類型來實現枚舉類型限制

今天使用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
相關文章
相關標籤/搜索