ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Go언어의 const 식별자 iota 소개
    Go 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 열거자에 대해 소개해 드렸습니다.

Designed by Tistory.