Golang에서 열거형을 구현하는 방법에 대한 간략한 분석(코드 포함)

青灯夜游
풀어 주다: 2022-02-04 09:00:31
앞으로
5478명이 탐색했습니다.

Golang에서 열거형을 구현하는 방법은 무엇입니까? 다음 글에서는 Golang에서 열거형을 구현하는 방법을 소개하겠습니다. 도움이 되셨으면 좋겠습니다!

Golang에서 열거형을 구현하는 방법에 대한 간략한 분석(코드 포함)

프로그래밍 분야에서 열거형은 제한된 수의 고정 값만 포함하는 유형을 나타내는 데 사용됩니다. 열거형은 일반적으로 오류 코드나 상태 기계를 식별하기 위해 개발에 사용됩니다. 엔터티 개체의 상태 머신을 예로 들면 일반적으로 데이터베이스에서 이 개체의 해당 레코드 상태를 식별하는 필드 값에 해당합니다. [관련 추천 : Go 영상 튜토리얼]

처음 프로그래밍을 배우기 시작했을 때 매직넘버를 직접 사용해 판단하는 코드를 작성했거나 적어도 본 적이 있을 것입니다. 예를 들어 기사를 상단에 고정하려면 먼저 해당 기사가 게시되었는지 확인해야 합니다.

if (article.state == 2) {
   // state 2 代表文章已发布
}
로그인 후 복사

우리 코드에 주석이 없거나 우리 프로젝트의 코드가 이러한 마법의 숫자 판단으로 가득 차 있다면 머리가 아플까요?

나중에 이러한 상태 값을 상수로 정의하는 방법을 배웠고, 이 논리를 별도로 캡슐화하기 위해 개체의 상태를 결정하는 방법도 개발했습니다.

public class ArticleState {
    
    public static final int Draft = 1; //草稿
    
    public static final int Published = 2; //发布
    
    public static final int Deleted = 3; // 已删除
}

public  Boolean checkArticleState(int state) {
    
    ...
    
}
로그인 후 복사

이 사용법은 프로그램에서 판단을 내리기 위해 마법의 숫자를 직접 사용하는 것보다 확실히 훨씬 낫습니다. 적어도 두통을 일으키거나 저주하고 싶지는 않습니다.

그러나 나중에 나를 데려간 형은 이 방법에도 단점이 있다고 말했습니다. 위의 checkArticleState 메서드는 기사 상태를 확인하는 데 사용됩니다. 이는 호출자가 ArticleState의 세 가지 정적 상수 중 하나를 전달하도록 하기 위한 것입니다. 그러나 유형 제약이 없기 때문에 int 값 전달이 구문상 허용되며 컴파일러는 열거형을 사용하는 것이 더 적절합니다.

저~! 제가 대학에서 자바를 가르칠 때 학기중에 선생님께서 이런 말씀을 하신 기억이 없습니다. 수업시간에 휴대폰으로 놀다가 놓친 또 하나의 지식 포인트가 아닐까요? 따라서 열거를 사용한 후 Java 코드는 다음과 같습니다.

// 使用enum而非class声明
public enum ArticleState {
	
    //要在enum里创建所有的枚举对象
    Draft(1, "草稿");
    Published(2, "已发布");
    Deleted(3, "已删除")
      
    // 自定义属性
    private int code;

    private String text;
  
    // 构造方法必须是private的
    ArticleState(int code, String text) {
        this.code = id;
        this.text = name;
    }
}

public  Boolean checkArticleState(ArticleState state) {
    
    ...
    
}
로그인 후 복사

이렇게 하면 형식 매개변수의 열거 유형을 사용하여 정수 값을 매개변수로 checkArticleState 메소드에 전달할 때 잘못된 상태 값을 필터링할 수 있습니다. 유형이 일치하지 않습니다. 컴파일에 실패하면 컴파일러는 코드를 작성할 때 즉시 메시지를 표시합니다.

Java를 사용해 본 적이 없더라도 걱정하지 마세요. 주요 문법 사항을 주석으로 표시해 두었으니 누구나 이해할 수 있을 것입니다.

지난 2년 동안 주로 Go를 사용하여 프로젝트를 진행했는데 Go에서도 비슷한 문제가 발생하는 것을 발견했습니다. 그렇다면 상태 값을 올바르게 제한하는 방법은 무엇일까요? int형 상수를 계속 사용한다면 확실히 작동하지 않을 것입니다. 예:

 const (
     Draft int = 1
     Published = 2
     Deleted   = 3
 )

 const (
     Summer int = 1
     Autumn     = 2
     Winter     = 3
     Spring     = 4
 )

 func main() {
     // 输出 true, 不会有任何编译错误
     fmt.Println(Autumn == Draft)
 }
로그인 후 복사

예를 들어 위에서 정의된 int 유형 상수 두 세트 중 하나는 기사의 상태를 나타내고 다른 하나는 사계절을 나타냅니다. 이런 식으로 기사 상태를 시즌과 비교할 때 컴파일 오류가 발생하지 않습니다.

답은 Go의 내장 라이브러리 코드나 우리 모두가 알고 있는 일부 오픈 소스 라이브러리에서 찾을 수 있습니다. 예를 들어 google.golang.org/grpc/codes에 gRPC 오류 코드가 어떻게 정의되어 있는지 보면 열거형을 올바르게 구현하는 방법을 이해할 수 있습니다.

int를 기본 유형으로 사용하여 별칭 유형을 만들 수 있습니다. Go는 이를 지원합니다

type Season int

const (
	Summer Season = 1
	Autumn        = 2
	Winter        = 3
	Spring        = 4
)
로그인 후 복사

물론 Go에서는 연속 상수 값을 정의할 때 iota를 자주 사용하므로 위의 정의를 더욱 단순화할 수 있습니다.

type Season int

const (
	Summer Season = iota + 1
	Autumn
	Winter
	Spring
)

type ArticleState int

const (
  Draft int = iota + 1
  Published
  Deleted  
)

func checkArticleState(state ArticleState) bool {
	// ... 
}

 func main() {
   // 两个操作数类型不匹配,编译错误
   fmt.Println(Autumn == Draft)
	// 参数类型不匹配,但是因为 ArticleState 底层的类型是 int 所以传递 int 的时候会发生隐式类型转换,所以不会报错
   checkArticleState(100)
 }
로그인 후 복사

이러한 상태 값의 기본 유형은 모두 int 값이지만 이제 관련되지 않은 두 유형의 열거형 값을 비교하면 컴파일 오류가 발생합니다. 이제 상태 값을 사용할 때마다 유형 제한이 있기 때문입니다.

그러나 ArticleState의 기본 유형이 int이기 때문에 checkArticleState 함수의 매개변수 유형은 ArticleState로 설정됩니다. 따라서 checkArticleState를 호출할 때 int 유형 매개변수를 전달하면 암시적 유형 변환이 발생하고 컴파일 오류가 발생하지 않습니다. 이 문제를 해결하려면 유형을 재정의해야만 이를 달성할 수 있습니다.

이 답변을 참조하세요. StackOverflow:

https://stackoverflow.com/questions/50826100/how-to-disable-implicit-type-conversion-for-constants

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 비디오를 방문하세요! !

위 내용은 Golang에서 열거형을 구현하는 방법에 대한 간략한 분석(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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