Go에서 상수(const)는 컴파일 타임에 계산되며 암묵적 유형을 가질 수 있습니다. iota는 상수 블록을 선언할 때 연속적인 값을 생성하는 데 사용되는 특수 식별자입니다. iota는 새 상수가 추가될 때마다 블록 내에서 1씩 증가합니다.
유형을 지정하지 않고 할당하면 상수가 개발자가 예상하는 것과 다른 유형을 가질 수 있으며, 특히 수학적 또는 논리적 연산에 참여할 경우 문제가 발생할 수 있습니다. 이는 암묵적 변환과 컴파일 오류를 초래할 수 있습니다.
예제:
type Level int const ( Low Level = iota // Low: Level == 0 Medium // Medium: Level == 1 High // High: Level == 2 ) // 유형을 지정하지 않으면: const ( Foo = iota // Foo: int == 0 Bar // Bar: int == 1 )
iota를 사용하여 상수의 값이 "타입화"될 수 있습니까? 명시적으로 유형이 지정되지 않으면 어떤 유형이 됩니까?
답변: 유형이 명시적으로 지정되지 않으면 상수는 무형이 되며 사용 컨텍스트에서 유추된 유형(예: 수학에서 사용될 경우 int)을 부여받습니다. 이는 타입 별칭 사용 시 또는 엄격한 타입화가 필요한 경우에 문제를 일으킬 수 있습니다.
예제:
type Status uint8 const ( Ready Status = iota+1 // Ok // 만약 const Ready = iota+1로 선언했다면 — 유형은 int가 되어 Status가 아닙니다. )
이야기
상태를 json을 통해 직렬화하는 과정에서, 개발자는 명시적 유형 없이 iota를 사용하여 const를 선언했습니다. 결과 — 직렬화가 사람이 읽을 수 있는 문자열이 아닌 int를 반환하여 프론트엔드가 잘못된 값을 해석하기 시작했습니다.
이야기
프로젝트에 State(type State int) 유형이 도입되었지만, 상수는 타입 없이 남아 있었습니다. 이로 인해 인터페이스가 State 유형의 값을 수용할 수 없게 되었고, 상수와 변수 간의 타입 불일치와 관련된 불쾌한 버그가 발생했습니다.
이야기
엔지니어가 iota를 통해 새 열거형 값을 추가했으나 유형을 지정하지 않았습니다. 그 결과 컴파일러는 상수를 int 종류의 다른 변수와 비교할 수 있도록 허용하여 프로덕션 비즈니스 로직의 분기 오류를 초래했습니다.