Stringer の生成コードを読む kofuk 2025-01-18 Gopher's Gathering #ggring
自己紹介 ● 福田 航生 (kofuk) ○ X: @man_2_fork ○ 福岡生まれ、福岡育ち ○ 普段はグループウェアの会社で Web エンジニアをしています
Stringer といえば ● Go の最も基本的なインタフェースのひとつ ● 実装しておくと任意の型を fmt.Println などで いい感じに出力できる
Go で enum を使いたいとき…… ● 標準機能に enum がないので、 defined type + 定数で enum を表現する ● 値自体は整数 0, 1, 2, … でしかないので、 いい感じの文字列表現が欲しくなる ○ 明示的に Stringer を実装しないといけない
Stringer を自動生成する
おもしろポイント 1: 謎の関数 ● 定数を変更したときに stringer を実行し忘れるのを防ぐ親切機能 ● 定数の値が変わっているとコンパイルエラー ○ ● 配列の境界値チェックをコンパイル時に行ってくれるため 2019 年ごろに追加された(コミット)
おもしろポイント 1: 謎の関数 ● 定数の値を入れ替えてみると…… ● index out of bounds でコンパイルが通らなくなる
おもしろポイント 2: 条件によって生成結果が変わる ● 一番単純なパターン ● ひとつの文字列から文字列を切り出す
おもしろポイント 2: 条件によって生成結果が変わる
おもしろポイント 2: 条件によって生成結果が変わる
おもしろポイント 2: 条件によって生成結果が変わる ● 他にも配列に入れる整数の型に微妙な最適化が入る ● このあたりの機能は 2014 の最初のコミットから存在する ● 特に map を使うコードに切り替わる境界値があるが、 その値を決めた理由はよくわからなかった ○ コードレビューとかを見ても特に言及されていない
番外編: 地味に計算できる