Iota

Iota

상수 선언 안에서 쓰는 미리 선언된 식별자 iota는 연속된 비타입 정수 상수를 나타내요. 지금 막 상수 여러 개를 연속된 값으로 만들고 싶다면, 하나하나 숫자를 박아 넣지 말고 iota가 자동으로 인덱스를 세어 주는 걸 쓰면 돼요. 어디부터 자동으로 매겨지는지, 어떻게 응용하는지 함께 볼게요.

출처: Go Specification

본문

상수 선언 안에서, 미리 선언된 식별자 iota는 연속된 비타입 정수 상수를 나타내요. 그 값은 해당 상수 선언 안에서 각 ConstSpec의 인덱스인데, 0부터 시작해요. 이걸 쓰면 서로 관련된 상수 무리를 깔끔하게 만들 수 있죠:

const (
	c0 = iota  // c0 == 0
	c1 = iota  // c1 == 1
	c2 = iota  // c2 == 2
)

const (
	a = 1 << iota  // a == 1  (iota == 0)
	b = 1 << iota  // b == 2  (iota == 1)
	c = 3          // c == 3  (iota == 2, unused)
	d = 1 << iota  // d == 8  (iota == 3)
)

const (
	u         = iota * 42  // u == 0     (untyped integer constant)
	v float64 = iota * 42  // v == 42.0  (float64 constant)
	w         = iota * 42  // w == 84    (untyped integer constant)
)

const x = iota  // x == 0
const y = iota  // y == 0

정의상, 같은 ConstSpec 안에서 iota를 여러 번 쓰더라도 그 값은 전부 같아요:

const (
	bit0, mask0 = 1 << iota, 1<<iota - 1  // bit0 == 1, mask0 == 0  (iota == 0)
	bit1, mask1                           // bit1 == 2, mask1 == 1  (iota == 1)
	_, _                                  //                        (iota == 2, unused)
	bit3, mask3                           // bit3 == 8, mask3 == 7  (iota == 3)
)

이 마지막 예시는 마지막 비어 있지 않은 표현식 목록의 암묵적 반복을 활용한 거예요.

더 알아보기

  • Constant declarationsiota가 실제로 쓰이는 상수 선언의 문법 규칙을 확인해 볼게요.
  • ConstSpeciota의 값이 바로 그 인덱스로 매겨지는 단위예요.
  • Constantsiota가 만들어 내는 비타입 정수 상수가 어떤 성질을 갖는지 살펴보면 좋아요.