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