本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
それでは、5分で完全に理解するiotaというテーマでさせていただきます。よろしくお願いします。
今回LTさせて頂くujiと申します。普段は株式会社マネーフォワードでエンジニアとして働いています。kyoto.goというコミュニティの運営にも参加しています。
先日開催されたGo ConferenceでもGoのGCをテーマにお話しているので、ご興味ある方はアーカイブからご覧ください( スライドはこちら)
iotaとは
それではさっそく本題に入ります。まずはiotaが何なのかをお話します。
今回皆さんに理解してもらうiotaですが、これはGoにおける定数生成器になります。このiotaは定数に連番の整数を割り当てる際に大きな威力を発揮します。
この説明だけだとよくわからないと思うので、例を見てみようと思います。
ワークフローなどのシステムで申請状態を表現したいというユースケースがあったとします。このような種別をコードで表現したいとき、Goでは整数型を使って連番の定数で表現するのが一般的です。
iotaを使わずに連番の定数を作ると、スライドのコードのように愚直に定数に値を代入することになります。
iotaを使うと、スライドのコードのようにすべての定数を同じ文で宣言して、同じことが実現できます。
さらにconst定義内では同じ定義は省略できるので、最初の定数に代入文を書くだけで同じことが実現できます。
このようにiotaを利用すると記述量も少なくなりますし、定数の追加や削除が容易になります。
iota Specification
iotaの使用についてもう少し詳しく解説したいと思います。
このiota、実は定義としては定数で、コンパイル時に値が決まります。constの括弧で括ってる部分をConstDecl、その中の定義式をConstSpecと呼ぶのですが、iotaにはConstDecl内のConstSpecのindexの値が入ります。よくカウントアップしてると勘違いされるのですが、そういうわけではありません。
実際のコードを見ながら説明すると、スライドのコードの場合、iotaはApprovedの部分で1度しか呼び出されていませんが、ApprovedにはConstSpecのindex値である2が入ります。
また、プロダクト開発の現場ではこのような使い方はあまりされませんが、スライドのコードのように1つの式でiotaを2回呼び出す場合でも、index値が評価されて、値が生成されます。
Approvedには2+2で4が入ります。
Tips - iotaの活用テクニック
ここからは、iotaの活用テクニックをご紹介します。
先程紹介した例に少しアレンジを加えたもので、iota+1を使うアイデアがあります。
Goはゼロ値の概念が存在するため、ゼロ値を定数から外すことで、変数の初期化時に意図せず分類されてしまうことを防ぐことができます。
またiota+1の代わりにindex値ゼロの定数にUnknownなどの名を付けて、使用を想定されていないことを明示的にする手段もあります。
あとは少しハックですが、ビットシフトを使ったテクニックもあります。これはiotaを使ってindexの数だけ1を左にビットシフトするもので、コードで例に挙げているユーザーの権限だったりとか、複数のフラグを持った状態を1つの値で表現したい場面で効果的です。
たとえば、Readの権限とCreateの権限を持った状態を表現したいときは、スライドのように2つの定数のビット和で表現できます。
また、表現された権限がRead権限を持っているかチェックしたいときは、2つの定数のビット積の結果で判断することができます。
このように初期化や比較をビット演算を使うことでシンプルに表現することができます。
iotaを使わないほうが良いケース
iotaの便利さを解説してきましたが、利用には注意する点があります。
iotaで宣言された定数ですが、順番の変更や定数の挿入追加などを行うと、それに伴い数値も変更されます。ですが、コードの差分には表れないため、数値の変更に気付きづらく、意図せずにプログラムの処理を変えてしまう可能性があります。
そのため、数値に意味がある定数、Exit CodeやDBに定義された値だったりする場合はiotaを使わない方が安全です。
GoにEnumがないのはなぜ?
最後に余談なんですが、ここまでセッションを見てくださってるGoユーザではない方は、なぜEnum列挙型がないのか、気になったかと思います。
Goのチームは、一般的な列挙型は解決したい課題に対して仕様が複雑すぎると考えており、列挙型の採用に至っておりません。
ですが、ここはユーザーからの要望も多く、Go2に向けてどういった形を取るかについて、現在も議論が続いています。
まとめ
以下、今回のサマリーです。
駆け足になりましたが、以上でLTを終了したいと思います。皆さんご清聴いただきありがとうございました。