golangのenumは型が違うと違うものとして扱われる

タイトルの通りです。

以下のようにint型のFooTypeBarTypeを宣言して、それぞれ60をenumで持つ値をチェックしてみます

package main

import "fmt"

type FooType int
type BarType int

const (
    Hoge FooType = 60
    Nyan FooType = 61
    Baz  BarType = 60
)

var someTypes = []interface{}{
    Hoge,
    Baz,
}

func main() {
    for _, t := range someTypes {

        if t == Baz {
            fmt.Println("same")
        } else {
            fmt.Println("difference")
        }
    }
    if Baz == 60 {
        fmt.Println("Baz is 60")
    } else {
        fmt.Println("Baz is not 60")
    }
}

出力

difference (`Hoge != Baz`)
same (`Baz == Baz`)
Baz is 60 

go.dev

ということでenumに設定した数値をリテラルで比較するとその値として出てくるけれど、enumで同様の値を持つ別の型の値と比較した場合は違う扱いになります。

つまるところgolangでは同じ数値範囲のenumも型を分ければ別物として扱えます。便利ですね。