고는 열거형 타입을 지원하지 않습니다만, 그 열거형의 목적을 달성할 수 있습니다. 아래의 코드는 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
