Go

Go언어의 const 식별자 iota 소개

드리프트2 2024. 3. 30. 15:43

 

Go언어에서 조금 덜 알려진 언어 명세인 iota에 대해 소개하겠습니다.

 

입문서에도 나오는 내용이지만, 읽고 지나치기 쉽죠.

 

특별히 새로운 내용은 아니므로 제목만 보고도 알고 있다 싶으신 분들은 다른 글로 넘어가셔도 됩니다.


iota란?

iota는 const(상수) 선언 내에서 기본으로 사용되는 식별자입니다.

 

타입 없는 정수의 연속된 값을 생성합니다. 구체적인 예시를 한번 보겠습니다.

package main

import "fmt"

const (
    zero  = iota 
    one   = iota
    two   = iota
    three = iota
)

func main() {
    fmt.Printf("zero:%v\n", zero)
    fmt.Printf("one:%v\n", one)
    fmt.Printf("two:%v\n", two)
    fmt.Printf("three:%v\n", three)
}

 

결과는 다음과 같습니다.

zero:0
one:1
two:2
three:3  

 

처음 한 개만 설정해두면 나머지는 생략할 수 있습니다.

 

(이는 iota에 국한된 것이 아니라, 정의할 값을 생략하면 바로 앞에서 정의된 값이 재사용됩니다.)

package main  

import "fmt"

const (
    zero  = iota
    one   
    two
    three
)

func main() {
    fmt.Printf("zero:%v\n", zero)
    fmt.Printf("one:%v\n", one) 
    fmt.Printf("two:%v\n", two)
    fmt.Printf("three:%v\n", three)
}

 

ConstSpec마다 증가하고, 다음 const 예약어가 나오면 리셋됩니다.

const (
    zero = iota // 0
    one  = iota // 1  
)
const (
    two   = iota // 0
    three = iota // 1
)

 

또한 const 내에서는 식에도 사용할 수 있습니다.

const (
    zero  = iota * iota // 0 
    one                 // 1
    two                 // 4
    three               // 9  
)
const (
    zero  = iota != 1 // true
    one               // false
    two               // true 
    three             // true
)

 

다른 정의와 함께 쓰여도 ConstSpec마다 증가합니다.

const (
    zero  = "zero" // zero
    one   = iota   // 1
    two   = "이"    // 이
    three = iota   // 3
)

 

또한 const 내에서 먼저 iota를 설정하면 꽤 재미있는 결과가 나왔습니다.

 

iota 기능이 아니라 상수가 우선시되었습니다.

const (
    iota  = "iota" // iota
    zero  = iota   // iota
    one            // iota
    two            // iota 
    three          // iota
)

 

타입 없는 정수이므로 const로 정의한 상수의 TypeOf를 하면 int가 됩니다.

package main

import (
    "fmt"
    "reflect"
)

const (
    zero = iota
)

func main() {
    fmt.Printf("zero type:%v\n", reflect.TypeOf(zero))
}

 

따라서 다음과 같이 정의하면 변환할 수 없어 컴파일 에러가 발생합니다.

const(
    zero string = iota
)

.../main.go:6: cannot convert 0 to type string


Github에서는 이렇게 사용한 경우가 있었네요

간단히 살펴본 바로는 단순히 플래그 비슷한 것을 const로 하는 소스가 대부분이었습니다만,

type ByteSize float64

const (
    _           = iota // 첫번째 값은 빈 식별자로 무시
    KB ByteSize = 1 << (10 * iota) 
    MB
    GB
    TB
    PB
    EB
    ZB
    YB  
)

마치며

이렇게 iota 열거자에 대해 소개해 드렸습니다.