> 백엔드 개발 > Golang > xybor-x/enum을 사용한 Go Enum의 문제와 해결 방법

xybor-x/enum을 사용한 Go Enum의 문제와 해결 방법

DDD
풀어 주다: 2024-12-19 18:44:11
원래의
842명이 탐색했습니다.

열거형이란 무엇입니까?

열거(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의 열거형

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을 처리할 때 몇 가지 문제가 있습니다.

  • 내장 메소드 부족: 모든 열거형 값 나열 또는 문자열과 열거형 간의 변환과 같은 기능을 직접 지원하지 않습니다.
  • 제한된 유형 안전성: 열거형은 일반적으로 기본 유형(예: int 또는 문자열)을 사용하여 표현되므로 의도하지 않은 할당의 위험이 증가합니다.
  • 직렬화 및 역직렬화 복잡성: JSON과 같은 형식 간에 열거형을 매핑하려면 추가 처리가 필요합니다.

xybor-x/enum 라이브러리

Go Enum’s problems and solutions with xybor-x/enum

xybor-x/enum 라이브러리는 코드 생성 없이 Go enum을 위한 우아하고 사용하기 쉽고 강력한 솔루션을 제공합니다.

xybor-x/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"
}
로그인 후 복사

WrapEnum

장점?

  • 상수 값을 지원합니다.
  • 다양한 유용한 내장 메소드를 제공합니다.
  • 직렬화 및 역직렬화가 즉시 지원됩니다.

단점?

  • 기본형 안전만 제공합니다.
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

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿