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