Go에서의 상수는 그냥 우리가 알고 있는 그 상수
상수는 컴파일 시간에 생성되고(지역 변수로 선언되었다 하더라도), 숫자, 문자, 문자열, boolean만이 상수가 될 수 있음
컴파일러가 컴파일 할 때 인지할 수 있도록 반드시 상수 표현식으로 정의되어야 함
Go에서 상수는 iota을 이용해 열거형으로 생성할 수 있음
iota가 표현식의 일부가 될 수 있고, 표현식은 암식적으로 반복이 가능해 복잡한 일련의 값들을 쉽게 생성할 수 있음
type ByteSize float64
const (
_ = iota // blank 지시자를 할당해서 첫번째 값 0 을 무시
KB ByteSize = 1 << (10 * iota) // iota 값은 1 이 됨
MB // 1 << (10 * 2) 의 결과가 됨
GB // 1 << (10 * 3) 의 결과가 됨
TB
PB
EB
ZB
YB
)
func (b ByteSize) String() string {
switch {
case b >= YB:
return fmt.Sprintf("%.2fYB", b/YB)
case b >= ZB:
return fmt.Sprintf("%.2fZB", b/ZB)
case b >= EB:
return fmt.Sprintf("%.2fEB", b/EB)
case b >= PB:
return fmt.Sprintf("%.2fPB", b/PB)
case b >= TB:
return fmt.Sprintf("%.2fTB", b/TB)
case b >= GB:
return fmt.Sprintf("%.2fGB", b/GB)
case b >= MB:
return fmt.Sprintf("%.2fMB", b/MB)
case b >= KB:
return fmt.Sprintf("%.2fKB", b/KB)
}
return fmt.Sprintf("%.2fB", b)
}