😳

[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()
}