onemuri.space

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 と連動することも多いので使用するかどうかは慎重にすべきです。

自己紹介用画像

Riki Akagi

2019年からDeNAで働いています。GCP(CloudSQL・GAE・Cloud Function etc)とGoでAPI開発に勤んでいます。睡眠やエンジニアリングに関することに興味を持って過ごしているのでその情報を皆さんに共有していけたらなと思っています。

自己紹介の詳細