고등학교 때 상수라는 친구가 있었는데, 잘 살고 있는지 모르겠다.

상수 선언과 초기화

<예제 코드>

package main

import "fmt"

const Pi = 3.14

func main() {
    const World = "안녕"
    fmt.Println("Hello", World)
    fmt.Println("Happy", Pi, "Day")

    const Truth = true
    fmt.Println("Go rules?", Truth)
}

<실행 결과>

Hello 안녕
Happy 3.14 Day
Go rules? true

const 키워드를 사용하여 상수를 선언한다.
함수 안 밖에서 다 선언 가능하다.
선언하면서 값을 대입해주기 때문에 데이터 타입은 없어도 된다.
아직 잘 모르겠지만, C/C++은 상수명 전체를 대문자로 쓰는 관습이 있는데, Go에서의 상수는 첫글자만 대문자로 써주는 관습이 있는 거 같다. 일단 모두 소문자로 써도 에러가 발생하지 않는다.

Go rules? true
Go가 지배한다? 사실? 뭔가 자부심 + 야망이 넘친다.

숫자형 상수(Numeric Constants)

<예제 코드>

package main

import "fmt"

const (
    Big   = 1 << 100
    Small = Big >> 99
)

func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
    return x * 0.1
}

func main() {
    fmt.Println(needInt(Small))
    fmt.Println(needFloat(Small))
    fmt.Println(needFloat(Big))
}

<실행 결과>

21
0.2
1.2676506002282295e+29

위의 코드에서 여러개의 상수를 ()를 이용하여 열거하여 깔끔하게 표현하였다.

상수 Big은 정수 1을 << 비트 왼쪽 시프트 연산한 결과로
1267650600228229401496703205376의 정수형태의 매우 큰 값을 갖는다.
상수 Small은 상수 Big을 >> 비트 오른쪽 시프트 연산한 결과로 2의 심플하고 작은 정수값을 갖는다.

첫번째 결과는 일반적인 정수끼리 연산 결과,
두번째 결과는 정수와 실수를 연산한 결과,
마지막 결과값은 매우 큰 정수를 실수로 연산한 결과를 실수지수표현방식으로 출력했다.

마지막 코드를 fmt.Println(needInt(Big))으로 바꿔서 실행하면,
<실행 결과>

prog.go:18:24: constant 1267650600228229401496703205376 overflows int

매우 큰 정수값을 int 데이터 타입에 때려넣으니 당연히 오버플로우가 발생한다;;;

이 예제의 요점은 정밀한 상수 표현이 가능하다는 것이다.

출처

https://go-tour-kr.appspot.com/#14
https://go-tour-kr.appspot.com/#15