Go 언어 상수


상수는 프로그램이 실행되는 동안 수정되지 않는 간단한 값의 식별자입니다.

상수의 데이터 유형은 부울, 숫자(정수, 부동 소수점 및 복소수) 및 문자열만 가능합니다.

상수 정의 형식:

const identifier [type] = value

컴파일러는 해당 값을 기반으로 변수의 유형을 추론할 수 있으므로 유형 지정자 [type]을 생략할 수 있습니다.

  • 명시적 유형 정의: const b string = "abc"

  • 암시적 유형 정의: const b = "abc"

동일한 유형의 여러 선언은 다음과 같이 축약될 수 있습니다.

const c_name1, c_name2 = value1, value2

다음 예에서는 상수 적용을 보여줍니다.

package main

import "fmt"

func main() {
   const LENGTH int = 10
   const WIDTH int = 5   
   var area int
   const a, b, c = 1, false, "str" //多重赋值

   area = LENGTH * WIDTH
   fmt.Printf("面积为 : %d", area)
   println()
   println(a, b, c)   
}

위 예의 결과는 다음과 같습니다.

面积为 : 50
1 false str

상수는 열거형으로도 사용할 수 있습니다.

const (
    Unknown = 0
    Female = 1
    Male = 2
)

숫자 0, 1, 2는 각각 알 수 없는 성별, 여성, 남성을 나타냅니다.

상수는 len(), cap(), unsafe.Sizeof() 상수를 사용하여 표현식의 값을 계산하는 데 사용할 수 있습니다. 상수 표현식에서 함수는 내장 함수여야 합니다. 그렇지 않으면 컴파일되지 않습니다.

package main

import "unsafe"
const (
    a = "abc"
    b = len(a)
    c = unsafe.Sizeof(a)
)

func main(){
    println(a, b, c)
}

위 예의 결과는 다음과 같습니다.

abc 3 16

iota

iota, 특수 상수, 컴파일러에 의해 수정될 수 있는 상수라고 생각할 수 있습니다.

각 const 키워드가 나타날 때마다 0으로 재설정되고, 다음 const가 나타나기 전에 iota가 나타날 때마다 그것이 나타내는 숫자가 자동으로 1씩 증가합니다.


iota는 열거형 값으로 사용될 수 있습니다:

const (
    a = iota
    b = iota
    c = iota
)

첫 번째 iota는 0과 같습니다. iota가 새 행에 사용될 때마다 해당 값은 자동으로 추가됩니다. 1; 따라서 a=0, b=1, c=2는 다음과 같이 축약될 수 있습니다:

const (
    a = iota
    b
    c
)

iota Usage

package main

import "fmt"

func main() {
    const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //独立值,iota += 1
            e          //"ha"   iota += 1
            f = 100    //iota +=1
            g          //100  iota +=1
            h = iota   //7,恢复计数
            i          //8
    )
    fmt.Println(a,b,c,d,e,f,g,h,i)
}

위 예의 결과는 다음과 같습니다:

0 1 2 ha ha 100 100 7 8

흥미로운 iota 예를 살펴보겠습니다.

package main

import "fmt"
const (
	i=1<<iota
    j=3<<iota
    k
    l
)

func main() {
	fmt.Println("i=",i)
	fmt.Println("j=",j)
	fmt.Println("k=",k)
	fmt.Println("l=",l)
}

위 예의 결과는 다음과 같습니다.

i= 1
j= 6
k= 12
l= 24

iota는 0부터 시작하여 자동으로 1씩 증가한다는 의미이므로 i=1<< 0,j= 3<<1(<<; 왼쪽 시프트를 의미), 즉 i=1, j=6입니다. 이는 문제가 되지 않습니다. 출력 결과에서 k=입니다. 3<<2, l=3<<3.