最近割とGoを中心に触っているのですが、そこで出会ったものについて書いておきます。
初めてみた時は正直さっぱりってかんじでしたが、わかったらなんて便利なんだ!ってなりましたw
というわけで早速いきましょう!
iotaとは・・・?
iotaは以下のような使われ方をします。
const (
SCALE = iota
CROP
)
これだけです。
ほ?と思うかもしれませんねw
僕の実際の場合はCROPの位置にある変数が別の場所で使われていて、ここにたどり着いて、え?何も入ってないやん!w
ってなりました...
ただ、上記はこのように書き換えが可能で...
package main
import "fmt"
const (
SCALE = iota
CROP = iota
)
func main() {
fmt.Printf("zero:%v\n", SCALE)
fmt.Printf("one:%v\n", CROP)
}
全ての変数にiotaというものが代入されているとみることができます(goでは定義されていない場合、同じものが代入されます。)
実際に上記のプログラムをコピーして、以下で実行してみてください。
...。
さて、返ってきた値は...いかがでした?
実は...const修飾子で、上記のように定義されていると、上から順にSCALEに0が、CROPに1が入ります。
そして、その文字を定数として扱うことで、別の場所でも使えるようになるわけです。
これは、全てに対してiotaが代入されているのですが、iotaは上から順にインクリメント(+1)されていきます。
そのため、最初は0が、次は1が入っているわけです。
一般的にマジックナンバー(数値になんらかのステータスを持たせたようなフラグ等の値)はそのままにするべきではなく、その意味が伝わる名前をつけた定数別で定義して、それに数値を入れて使うことが多いです。
連番で数の多い場合ですが、その定数の設定しやすくしてくれます。
これは、goに限らず、enumと呼ばれたり、列挙型ともよばれ、複数の状態などを切り替えるための値に使われることが多いです。
例えば上記例ならばある画像を編集する際に拡大するか?クロップ(切り取り)するか?などの情報をenumとして設定していますね。
そんな連番でつける定数を使えるフラグ等によく使用されているようです。
ちょっと応用
また、これは先ほどのように連番で状態を保持させたいとか、フラグを用意したい〜という方法とは別で、もっと面白い使い方もできます。
例えばこちらです。
const (
ONE SquareNum = iota * iota
TWO
THREE
FOUR
)
このようにすると...?
iotaはインクリメントするはずなので、上から順に0*0, 1*1, 2*2, 3*3という値が入ることになるはずです。
つまり、0, 1, 4, 9ですね。
確認してみましょう。
いい感じになりましたね。
最初が0になってしまうのには気をつけてください。
そのままやってしまうと上記のように、ズレが生じるので、ブランク'_'をつかって対処するのがいいでしょう。
const (
_ = iota * iota
ONE
TWO
THREE
FOUR
)
先ほどのものを書き直して上記のようにするときっと理想通りに動くはずです。
ダミーで入れたフリをするわけですね。
このように、ただ連番の定数を用意するためだけでなく、インクリメントから導き出せるいい感じの値を式として定義することもできるわけです。
まとめ
さて、どうだったでしょうか?
定数っぽいの使われてるな?->追いかける
あれ?定数何も定義されてないじゃん!w
iotaってなんだ?ってなったらそういうことです。
応用的な使われ方はもっともっと色々有りそうで、便利に使えそうですね!
色々考えてみるもの面白いかもしれません!