[Golang] array と slice と map を定数として使えない
びっくりしたのでメモ。
起こったこと
slice を定数として定義しようとしたら怒られた。
const numbers = []int{10,20}
// const initializer [<node DDD>]int literal is not a constant
調べてみると、slice だけでなく、array や map も定数として使えないらしい。
なんで使えないの
定数がコンパイル中に生成されるのに対して、array と slice と map は実行中に生成されるから、とのこと。 なるほど、コンパイルしてからじゃないと実行できない Go の性質上、たしかに array と slice と map で定数をつくれない。
Q. これって他の静的型付け言語でも同じ?なぜ Go はこの仕様にしたのかな
じゃあどうするか
グローバルに使える変数がほしいということであれば、var
で代替できる。
が、どんなに気をつけても変更してしまう可能性がある。
// do not mutate it
var numbers = []int{10}
func main() {
// numbers
}
より定数っぽくするなら getter をつくるといい。 これなら誤って変更してしまうことはない。
func getNumbers() []int {
return []int{10}
}
func main() {
// numbers := getNumbers()
}