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
가 나오게 된다
댓글