Go에서 Enum을 정의할 때의 우려 사항

4878 단어 Go
@mosaxiv 선생의 대타, Go로 Enum을 정의할 때 신경 쓰이는 일과 그 해결 방법을 이야기합니다.
Go에는 기본 Enum 정의 메커니즘이 없으므로 일반적으로 const 선언에서 다음과 같이 정의됩니다.
type Type int

const (
    a Type = iota
    b
    c
)
그러나 Go에서 변수를 초기화할 때 값 Zero-Value 을 명확하게 대입하지 않으면 기본적으로 할당된 값이 결정됩니다.예를 들어, 유형 변수는 "0"입니다.
그리고 iota 는 "0"에서 시작하는 연속 정수를 생성하는 식별자이기 때문에 위에서 설명한 int 이 기본값이지 않으면 변수를 초기화할 때 명확한 지정값이 없어도 기본값이 아닌 iota 상태가 발생합니다.
나는 문장에서 전달하기가 좀 어렵다고 생각해서 코드로 표시하면
type S struct {
    T Type
}

func main() {
    s := S{}
    switch s.T {
    case a:
        fmt.Println("a") // <- 実際にはここを通る
    case b:
        fmt.Println("b")
    case c:
        fmt.Println("b")
    default:
        fmt.Println("default") // <- s.T に何も設定していなかったらここを通ってほしい
    }
}
이런 경우
"1"부터 이 문제를 해결할 수 있습니다a.이 점은 쓸데없는 일에 참견하기 때문에 다음과 같은 의도로 처리할 것이다.
const (
    a Type = iota + 1 // <- 1から始める
    b
    c
)

func main() {
    s := S{}
    switch s.T {
    case a:
        fmt.Println("a")
    case b:
        fmt.Println("b")
    case c:
        fmt.Println("b")
    default:
        fmt.Println("default") // <- s.T に何も設定していないのでここを通る!
    }
}
다만 이 해결 방안이 가장 좋은지, 더 좋은 방안이 있는지 모르겠다.이런 분은 댓글란으로 오세요.

좋은 웹페이지 즐겨찾기