Goのiotaの正体

今までよく考えずに使っていのでメモ.

先日,会社のslackで以下のplaygroundがshareされた.

play.golang.org

雑に(0, 2, 4)かなぁと思いつつも(1, 5, 9)で無い確信もなかった. 実行してみると正解は,

A = 0
B = 2
C = 4

なるほど.

そもそもiotaってなんだっけ?とGoの仕様書を読みにいく.

golang.org

Its value is the index of the respective ConstSpec in that constant declaration, starting at zero.

なるほど,これって定数宣言の中の定数リストのindexだったのか. 今まで雑にiota使えばインクリメントされて〜みたいな意識だったので理解を改めた.

その上でさっきのコードや仕様に載ってるサンプルコードを読んでみるとなるほど確かに. そりゃそうなるわ.

const (
    bit0, mask0 = 1 << iota, 1<<iota - 1  // bit0 == 1, mask0 == 0  (iota == 0)
    bit1, mask1                           // bit1 == 2, mask1 == 1  (iota == 1)
    _, _                                  //                        (iota == 2, unused)
    bit3, mask3                           // bit3 == 8, mask3 == 7  (iota == 3)
)

改めて,他の言語仕様で培われた色メガネでGoの仕様を捉えてはいけないなと思った.

自戒を込めて.