고는 열거형 타입을 지원하지 않습니다만, 그 열거형의 목적을 달성할 수 있습니다. 아래의 코드는 12개의 달(Month)에 대한 고 언어적 열거형 타입의 정의입니다.
type Month int const ( January Month = 1 + iota February March April May June July August September October November December ) var months = [...]string{ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", } func (m Month) String() string { return months[(m-1)%12] }
언어에서 근본적으로 열거형을 지원하지 않다보니, 다소 불편하고 어색하기는 합니다. 주지해야 할 코드만을 살펴보면, 4번에서 상수형 값 정의시 iota는 그 이후의 상수값들을 1씩 더해 정의되어지도록 지정합니다. 즉, January에 1의 값으로 정의되고, 그 다음인 February는 2의 값을 자동으로 갖도록한다는 것입니다. 그리고 33번은 Month를 enum 타입으로써 그 문자열 명칭을 갖도록 매서드를 추가해 주는 것입니다. 달의 순환이라는 개념을 위해 12로 나눈 나머지값을 인덱스 값으로 취했습니다. 활용하는 코드는 아래와 같습니다.
func main() { month := December if month == December { fmt.Println("Found a December") } month = month + Month(2) fmt.Println(month) month = January + Month(2) fmt.Println(month) month++ fmt.Println(month) day := 34 month = Month(day % 31) fmt.Println(month) val := int(month) + 4 fmt.Println(val) month = Month(val) + 1 fmt.Println(month) }
우리가 원하는 enum 타입의 정의대로 그 결과값을 그대로 얘상할 수 있는데요. 결과는 아래와 같습니다.
Found a December February March April March 7 August