Go에서 열거형을 작성하는 방법과 이유

4376 단어 gobackendconstantenum


게시물How and Why to Write Enums in GoQvault에 처음 등장했습니다.

enumerator 의 줄임말인 enum 은 명명된 상수 값 집합입니다. 열거형은 개발자가 유용한 이름을 가지면서도 단순하고 고유한 값을 갖는 복잡한 상수 집합을 만들 수 있는 강력한 도구입니다.

구문 예



상수 선언 내에서 iota 키워드는 유형이 지정되지 않은 연속 정수 상수를 나타냅니다.

type BodyPart int

const (
    Head BodyPart = iota // Head = 0
    Shoulder // Shoulder = 1
    Knee // Knee = 2
    Toe // Toe = 3
)


열거형을 사용해야 하는 이유는 무엇입니까?



값이 0인 Head라는 정수 상수가 필요한 이유는 무엇입니까? 그렇다면 const Head = 0 을 사용할 수 없습니까?



예, 그렇게 할 수 있지만 열거형은 상수 집합을 그룹화하고 고유한 값을 보장하는 방식에서 강력합니다. 열거형을 사용하면 컴파일러에서 그룹의 상수( Head , Shoulder , KneeToe )가 동일한 값을 가지지 않도록 합니다.

문자열을 사용하지 않는 이유는 무엇입니까? const 머리 = "머리" 및 const 어깨 = "어깨" ?



고유성을 보장하지 않는 컴파일러의 중복 응답 외에도 문자열도 과도할 수 있습니다. 4개, 10개 또는 100개의 고유한 값으로 구성된 그룹이 있는 경우 전체string를 저장해야 합니까? 작음int은 프로그램의 메모리 공간에서 더 적은 공간을 차지합니다.

특히 최신 하드웨어가 얼마나 강력한지 공간에 관한 것만은 아닙니다. 다음 예와 같은 일부 구성 변수가 있다고 가정해 보겠습니다.

const (
    statusSuccess = iota
    statusFailed
    statusPending
    statusComplete
)


이제 코드베이스의 나머지 부분과 일관성을 유지하기 위해 statusFailed 의 이름을 statusCancelled 로 변경해야 한다고 가정합니다. 이전에 열거형 대신 문자열 값failed을 사용했는데 이제 해당 값이 시스템의 다양한 데이터베이스와 파일에 흩어져 있는 경우 변경하기가 정말 어려워집니다. 방금 enum 를 사용한 경우 혼란을 주지 않고 이름을 변경할 수 있습니다.

1부터 시작하는 열거형



때때로 당신이 마조히스트이거나 아마도 Lua 개발자라면 열거형 목록이 기본값1 대신 0 값으로 시작하기를 원할 것입니다.

const (
    Head = iota + 1 // 1
    Shoulder // 2
    Knee // 3
    Toe // 4
)


승수가 있는 열거형


iota 키워드는 단순히 const 블록 내에서 사용될 때마다 하나 더 큰 숫자가 증가하는 정수 상수를 나타냅니다. 원하는 수학을 수행하는 데 사용할 수 있습니다.

const (
    Head = iota + 1 // 0 + 1 = 1
    Shoulder = iota + 2 // 1 + 2 = 3
    Knee = iota * 10 // 2 * 10 = 20
    Toe = iota * 100 // 3 * 100 = 300
)


이를 염두에 두고 할 수 있다고 해서 반드시 해야 한다는 의미는 아님을 기억하십시오.

값을 건너뛰는 열거형



값을 건너뛰려면 반환 변수를 무시하는 것처럼 _ 문자를 사용하십시오.

const (
    Head = iota // 0
    _
    Knee // 1
    Toe // 2
)


Go의 문자열 열거형



Go에는 열거형에 대한 내장 기능string이 없지만 깨끗한String() 메서드를 간단히 구현하는 것은 매우 쉽습니다. 상수 자체를 문자열 유형으로 설정하는 대신 String() 메서드를 사용하면 문자열의 "인쇄 가능성"과 함께 enum과 동일한 이점을 얻을 수 있습니다.

type BodyPart int

const (
    Head BodyPart = iota // Head = 0
    Shoulder // Shoulder = 1
    Knee // Knee = 2
    Toe // Toe = 3
)

func (bp BodyPart) String() string {
    return [...]string{"Head", "Shoulder", "Knee", "Toe"}
}


그러나이 접근 방식에는 몇 가지 "고장"이 있으므로주의하십시오. const 블록의 선언 수가 String() 메서드에서 생성된 "constant slice "의 항목 수와 다른 경우 컴파일러는 잠재적인 "범위를 벗어난"오류에 대해 경고하지 않습니다. 또한 상수 중 하나의 이름을 업데이트하는 경우 목록에서 해당 문자열을 업데이트하는 것을 잊지 마십시오.

읽어 주셔서 감사합니다. 이제 과정을 수강하십시오!

기술 분야의 고임금 직업에 관심이 있으십니까? 실습 코딩 과정을 마친 후 인터뷰를 시작하고 멋지게 통과합니다.

Start coding now

질문?



질문이나 의견이 있으면 트위터에서 나를 팔로우하고 연락하십시오. 기사에서 실수를 한 경우 반드시 let me know 수정하여 수정할 수 있도록 해주세요!

Subscribe 받은 편지함으로 바로 전달되는 더 많은 코딩 기사를 보려면 내 뉴스레터로 보내십시오.

좋은 웹페이지 즐겨찾기