🐢

Golangのenum魔法

2023/12/14に公開

Better safe enum type in Golang

JavaのEnums

今回 Enumsについて話したいと思います。

Enums は特別なクラスでオブジェクトにパラメターつけたら制限になっています。

Javaには、こんな書き方です

public enum Vehicle {
    CAR, BICYCLE, MOTORBIKE
}

使い時に

public Transport {
	private Vehicle vehicle;

	public Transport(Vehicle vehicle) {
		this.vehicle = vehicle;
	}
}

そうするとTransport クラスに Vehicle enum を渡さないといけないです。

GolangのEnumsは。。。

Golangだったら iota やこんな書き方をします

type Vehicle string

const (
	Car       Vehicle = "car"
	Bicycle   Vehicle = "bicycle"
	Motorbike Vehicle = "motorbike"
)

Javaと似てますし、String()メソッドも書けます。

func (v Vehicle) String() string {
	return string(v)
}

だが、タイプは Vehicle じゃなくて別のタイプになってコンパイラーが怒られないです。

func validateVehicle(vehicle Vehicle) bool {
	switch vehicle {
	case "car", "bicycle", "motorbike":
		return true
	default:
		return false
	}
}

func main() {
	fmt.Println(validateVehicle(Bicycle))  // OK
	fmt.Println(validateVehicle("boat"))   // NO OK boatがVehicleじゃないです
}

少し変更しましょう

type vehicle string
type Vehicle interface {
	__private()
}
func (v vehicle) __private(){}

これ追加したらコンパイラーが怒られます!

CompilerErrorUsingSafeEnums

やったぜ~!

Happy coding!


参考

Discussion