본문 바로가기
카테고리 없음

Go의 iota 사용에 대해서

by 노아론 2020. 9. 5.

Go의 iota에 대해 다루는 글입니다

Go에서는 enum을 위해 constant로 정의하여 사용한다. 이때, iota라는 것을 사용할 수 있다.

iota는 0, 1, 2 양수의 형태로 상수를 제공하는 enumerator이다

const구문에서 첫번째 iota는 0으로 리셋되는 특성을 가지고 있으며, 그 다음 상수에선 1씩 증가하게 된다.

 

간단한 예시를 들어보자

const (
    SUN = 0
    MON = 1
    TUE = 2
    WED = 3
    // ...continue...
)

요일을 상수로 나타낼때 위와 같이 상수를 선언을 하게 된다

그러나, iota를 사용하여 위 상수를 더 간략하게 나타낼 수 있다

 

const (
    SUN = iota
    MON
    TUE
    WED
    // ...continue...
)

fmt.Println(SUN, MON, TUE, WED)

/* 출력결과
0 1 2 3
*/

위와 같이 SUN = iota를 나타내면 SUN 상수는 0, 아래 MON은 1, TUE는 2 와 같이 값이 지정된다.

 

const (
    SUN = iota
    _
    TUE
    WED
)

fmt.Println(SUN, TUE, WED)

/* 출력결과
0 2 3
*/

또한 위와 같이 중간에 blank identifier인 _를 통해 중간의 상수 선언을 스킵할 수 있다.

이를 응용하여 enum의 방식으로 상수를 사용할 수 있다.

 

만일 fmt.Println(SUN) 의 결과를 sunday로 받고 싶다면 어떻게 해야할까

먼저 switch를 이용해서 나타내보자 (참고로, 이는 아래에서 다룰 내용을 위해 먼저 제시해보는 좋지 않은 코드다😲)

package main

import (
    "fmt"
)

type Day int

const (
    SUN Day = iota
    MON
    TUE
    WED
    THU
    FRI
    SAT
)

func printDay(day Day) string {
    switch day {
    case SUN:
        return "sunday"
    case MON:
        return "monday"
    case TUE:
        return "tuesday"
    // 부분 생략
    default:
        return
    }
}

func main() {
    fmt.Println(printDay(SUN))
}

/* 출력결과
sunday
*/

위 코드의 결과를 보니 얼추 동작은 한다.

 

하지만, String 메소드의 오버라이드를 통해 출력하면 더 심플하게 작성할 수 있다

func (day Day) String() string{
    return []string{"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"}[day]
}

func main() {
    fmt.Println(SUN)
}

/* 출력 결과
sunday
*/

위와 같이 String function을 작성하면

fmt.Println(SUN)의 출력에서 의도하는 결과인 sunday가 나오게 된다

댓글