열거(enumeration)의 약자인 열거(enum)는 명명된 값 집합을 나타내는 특수 데이터 유형입니다. 개념적으로 관련된 상수 값의 집합을 정의하여 코드 가독성을 높이고 임의 리터럴 값 사용으로 인해 발생하는 오류를 줄이는 데 사용됩니다.
// Enum in Java enum TrafficLight { RED, YELLOW, GREEN }
# Enum in Python from enum import Enum class TrafficLight(Enum): RED = 1 GREEN = 2 BLUE = 3
Go는 기본적으로 enum을 지원하지 않습니다. 그러나 Go에서 열거형을 정의하는 인기 있는 방법은 iota 접근 방식을 사용하는 것입니다.
package main type TrafficLight int const ( RED TrafficLight = iota // 0 GREEN // 1 BLUE // 2 ) func main() { fmt.Println(RED) // Output: 0 }
그러나 이 방법으로 enum을 처리할 때 몇 가지 문제가 있습니다.
xybor-x/enum 라이브러리는 코드 생성 없이 Go enum을 위한 우아하고 사용하기 쉽고 강력한 솔루션을 제공합니다.
xybor-x/enum으로 작업할 수 있는 몇 가지 유형의 열거형이 있습니다. 가장 적합한 유형을 선택하세요.
장점?
단점?
package main type Role int const ( RoleUser Role = iota RoleAdmin ) func init() { enum.Map(RoleUser, "user") enum.Map(RoleAdmin, "admin") // Optional: ensure no new enum values can be added to Role. enum.Finalize[Role]() } func main() { // Print the corresponding string. fmt.Println(enum.ToString(RoleUser)) // Output: user // Print out all valid enums. fmt.Println(enum.All[Role]()) // Output: [0 1] // Parse an enum from int. r1, ok := enum.FromInt[Role](1) fmt.Println(ok) // Output: true fmt.Println(enum.ToString(r1)) // Output: admin // Parse an enum from string. r2, ok := enum.FromString[Role]("admin") fmt.Println(ok) // Output: true fmt.Println(r2) // Output: 1 // Serialize json. data, err := enum.MarshalJSON(RoleUser) fmt.Println(err) // Output: nil fmt.Println(string(data)) // Output: "user" }
장점?
단점?
package main // Only need to change the two following lines fromthe Basic enum. type role any type Role = enum.WrapEnum[role] const ( RoleUser Role = iota RoleAdmin ) func init() { enum.Map(RoleUser, "user") enum.Map(RoleAdmin, "admin") // Optional: ensure no new enum values can be added to Role. enum.Finalize[Role]() } func main() { // Print the corresponding string. No need to use enum.ToString. fmt.Println(RoleUser) // Output: user // Print out all valid enums. fmt.Println(enum.All[Role]()) // Output: [user admin] // Parse an enum from int. r1, ok := enum.FromInt[Role](1) fmt.Println(ok) // Output: true fmt.Println(r1) // Output: admin // Parse an enum from string. r2, ok := enum.FromString[Role]("admin") fmt.Println(ok) // Output: true fmt.Println(r2) // Output: admin // Now you can use json.Marshal instead of enum.MarshalJSON. data, err := json.Marshal(RoleUser) fmt.Println(err) // Output: nil fmt.Println(string(data)) // Output: "user" }
WrapEnum은 일반적인 경우에 가장 적합한 열거형입니다. 그러나 기본 유형 안전성만 제공합니다. 더 엄격한 것을 원한다면 SafeEnum 사용을 고려해 보세요.
// WrapEnum cannot prevent this type of invalid declaration. // Consider using SafeEnum. r := Role(42)
SafeEnum은 강력한 유형 안전 열거형을 정의합니다. WrapEnum과 마찬가지로 열거형 작업을 단순화하기 위한 내장 메소드 세트를 제공합니다.
SafeEnum은 엄격한 유형 안전성을 적용하여 사전 정의된 열거형 값만 허용되도록 합니다. 이는 새로운 열거형 유형이 실수로 생성되는 것을 방지하여 유효한 값 집합을 보장합니다.
장점?
단점?
지속적인 지원이 왜 중요한가요?
일부 정적 분석 도구(예: bazel용 nogo, 전체 확장이 포함된 golangci-lint)는 상수 열거형에서 전체 스위치 문 검사를 지원합니다. 지속적인 지원을 받는 열거형을 선택하면 이러한 도구에서 이 기능을 활성화할 수 있습니다.
// Enum in Java enum TrafficLight { RED, YELLOW, GREEN }
xybor-x/enum: https://github.com/xybor-x/enum
매체: https://medium.com/@huykingsofm/enum-handling-in-go-a2727154435e
베트남어 viblo: https://viblo.asia/p/cac-van-de-cua-go-enum-va-cach-giai-quyet-voi-xybor-xenum-Yym401A9J91
위 내용은 xybor-x/enum을 사용한 Go Enum의 문제와 해결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!