Go에 Enum 타입을 구현하는 방법
Emily Parker
Product Engineer · Leapcell

서문
열거형(Enumeration) 타입은 제한된, 미리 정의된 이름의 상수 값 집합을 나타내는 데 일반적으로 사용되는 데이터 타입입니다. 열거형 타입에서 각 상수는 enum 값이며, 모든 값은 동일하고 고유합니다.
열거형 타입은 일반적으로 요일, 월, 성별 등과 같은 관련 상수 집합을 나타내는 데 사용됩니다. 다른 언어(예: Java 및 C)에서는 열거형 타입이 내장되어 있습니다. 그러나 Go는 내장된 열거형 타입이 없으므로 유사한 enum 기능을 구현하기 위해 다른 접근 방식을 사용해야 합니다. 이 기사에서는 "열거형 타입"을 구현하는 방법을 보여줍니다.
Go의 "열거형 타입"
열거형 타입의 값은 본질적으로 상수이므로 Go에서 상수를 사용하여 유사한 enum 기능을 구현할 수 있습니다. 예를 들어 다음과 같습니다.
const ( Sunday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 Monday = 7 )
이 예제에서는 const
키워드를 사용하여 상수 그룹을 정의합니다. 여기서 각 상수의 이름은 enum을 나타내고 해당 값은 정수에 해당합니다.
이 예제는 enum 타입과 유사한 기능을 제공하지만 안전성 및 제약 조건과 같은 실제 enum 타입의 일부 특성이 부족합니다. 이러한 두 가지 문제를 해결하기 위해 사용자 정의 타입을 사용하여 개선할 수 있습니다.
type WeekDay int const ( Sunday WeekDay = 1 Tuesday WeekDay = 2 Wednesday WeekDay = 3 Thursday WeekDay = 4 Friday WeekDay = 5 Saturday WeekDay = 6 Monday WeekDay = 7 )
개선된 예제에서는 요일을 나타내는 사용자 정의 타입 WeekDay
를 정의합니다. 그런 다음 const
키워드를 사용하여 상수 그룹을 정의합니다. 여기서 각 상수는 특정 값이 할당되고 타입 강제 및 검사를 위해 WeekDay
타입으로 제한됩니다. 이를 통해 enum 값 이름을 사용하여 특정 요일을 나타낼 수 있으며, 사용자 정의 타입으로 인해 컴파일러가 타입 검사를 수행하여 타입 안전성을 향상시킬 수 있습니다.
iota
를 사용하여 Enum을 효과적으로 구현
이전 예제에서 볼 수 있듯이 여러 enum 값이 필요한 경우 각 enum 상수에 수동으로 값을 할당하는 것은 매우 번거로워집니다. 이 문제를 해결하기 위해 순차적인 정수 값을 생성하는 데 도움이 되는 iota
상수 생성기를 사용할 수 있습니다.
예를 들어 iota
를 사용하여 평일 enum 타입을 정의할 수 있습니다.
type WeekDay int const ( Sunday WeekDay = iota Tuesday Wednesday Thursday Friday Saturday Monday )
이 예제에서는 자동 증가 상수 생성기 iota
를 사용하여 평일의 열거형 타입을 정의합니다. 각 enum 값은 WeekDay
타입의 상수입니다. iota
의 자동 증가 규칙으로 인해 각 enum 값은 자동으로 증가하여 일련의 연속 정수 값을 생성합니다.
사용자 정의 Enum에 메서드 추가
type WeekDay int const ( Sunday WeekDay = iota Tuesday Wednesday Thursday Friday Saturday Monday )
구현된 "enum 타입"을 Java와 같은 다른 언어의 enum과 더 유사하게 만들기 위해 메서드를 추가할 수 있습니다.
Name()
enum 값의 이름을 반환합니다.
// Name returns the name of the enum value func (w WeekDay) Name() string { if w < Sunday || w > Monday { return "Unknown" } return [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}[w] }
Original
enum 타입에서 enum 값의 위치를 반환합니다.
// Original: Since enum values in this type are essentially integer constants, // we can directly use the enum value as its index. func (w WeekDay) Original() int { return int(w) }
String()
형식화된 출력을 위해 String
메서드를 구현합니다.
// Converts the enum value to a string for easy output func (w WeekDay) String() string { return w.Name() }
Values()
모든 enum 값을 포함하는 슬라이스를 반환합니다.
// Values returns a slice containing all enum values func Values() []WeekDay { return []WeekDay{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} }
ValueOf()
이름을 기반으로 해당 enum 값을 반환합니다.
// ValueOf uses a switch statement to return the corresponding enum value based on the name func ValueOf(name string) (WeekDay, error) { switch name { case "Sunday": return Sunday, nil case "Monday": return Monday, nil case "Tuesday": return Tuesday, nil case "Wednesday": return Wednesday, nil case "Thursday": return Thursday, nil case "Friday": return Friday, nil case "Saturday": return Saturday, nil default: return 0, fmt.Errorf("invalid WeekDay name: %s", name) } }
요약
일상적인 개발에서 열거형 타입은 매우 일반적으로 사용됩니다. Go에는 내장된 enum 타입이 없지만 자체적으로 유사한 "enum 타입"을 구현하는 것을 막지는 않습니다. 이를 구현할 때 타입 제약 조건 및 안전성 문제를 고려해야 합니다.
enum과 유사한 기능을 구현하는 방법은 여러 가지가 있습니다. 이 기사에서는 사용자 정의 타입을 사용하는 접근 방식을 소개했습니다. 핵심 아이디어를 이해하면 구조체 또는 기타 기술을 사용하여 유사한 enum 기능을 구현할 수도 있습니다.
Leapcell은 Go 프로젝트 호스팅을 위한 최고의 선택입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발합니다.
무료로 무제한 프로젝트 배포
- 사용량에 대해서만 지불하십시오. 요청이나 요금이 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불하십시오.
- 예: 25달러로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI입니다.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합입니다.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅입니다.
손쉬운 확장성 및 고성능
- 고도의 동시성을 쉽게 처리하기 위한 자동 확장입니다.
- 운영 오버헤드가 없습니다. 구축에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ