前のページ
Featured image of post golang iota のスコープについて

golang iota のスコープについて

zero = iota は 0 になると思ってたのに…

私は以下の(擬似)コードを書いたときに、全く意味がわからなかったです。

const (
  hoge = 10
  zero = iota
)

func main() {
  fmt.Println(hoge) // 10
  fmt.Println(zero) // 1  "0になると思ってた…"
}

https://play.golang.org/p/fKvv5K3sbtY

同じ const 内で iota を使ってみると?

せっかくなので実験的に、同じ const 内で再度 iota を使ってみました

const (
  zero = iota + 1
  one
  hoge = 10
  three = iota
)


func main() {
  fmt.Println(zero)  // 1
  fmt.Println(one)   // 2
  fmt.Println(hoge)  // 10
  fmt.Println(three) // 3
}

https://play.golang.org/p/tT-ip9-J8Qn

const 内で、再度 iota を使ってみても前の値の続きの値が入ってきていますね。

const を分けて iota を宣言してみると?

const を分けると iota はちゃんと別のものとして扱ってくれる

const (
  one = iota + 1
  two
  hoge = 10
)

const (
  three = iota
)

func main() {
  fmt.Println(one)   // 1
  fmt.Println(two)   // 2
  fmt.Println(hoge)  // 10
  fmt.Println(three) // 0
}

https://play.golang.org/p/JipHfUpsbzG

iota は同じスコープの中で連番が作成されているみたいですね。

詳しい説明は他の方のブログに書かれていたのでそちらを参考にしてみてください。
https://www.uniuniunicode.com/posts/2019/12/iota/

まとめ

golang の iota は使い所間違うと、ミスを引き起こしやすいのでできるだけ数値に対する意味がない場所で使うようにしましょう。例えば、区分値データのようなものは DB と連動することも多いので使用するかどうかは慎重にすべきです。

このページでは、Google Analyticsを利用しています。