おさかな日誌

魚類がプログラミング

最近 golang 書いてる

社内でパフォーマンスチューニングコンテストが開催されてテンション⤴⤴になったので Ruby 実装だった認証認可サーバーの負荷の高い部分を golang で書いてみるのやってみた。

net/http で素のまま書こうと思ったけど、ちょっと検索したら Gin Web Framework というのがあって、よさそうだったので使ってみた。よさそうポイント1、Rack middleware みたいなものがあって before/after filter みたいなのが楽そうだった。2、JSON レスポンスの生成が楽そうだった。適当な HashMap 渡してエンコードしてくれる。最終的にはちゃんとレスポンスも型付けしたほうがいいんだけど楽なやりかたもあると golang 初心者的にうれしい。3、なんかパフォーマンス⤴⤴みたいな空気感じた。あと、そんなに複雑じゃなくていつでも net/http 実装とかに移れそうなのも ++。

DB に関してはいくつか迷った。最初は golang だしなるべく薄くしたほうがよさそうという先入観があって SQL builder 使おうと思って Squirrel を選んだんだけど、最初の MySQL サーバーにつなぐのに手こずってたぶん自分がなんか間違えてたんだけど「まじかー」ってなって別のを探し始めた。検索してたら gorm が今っぽいのでは?という電波を受け取ったので gorm でセットアップしてみたらうまく MySQL サーバーにつなげたので gorm でいくことにした。

あと memcached サーバーにも繋ぐ必要があったので、探してみたけどあんまり選択肢ないのか gomemcache にすぐ決まった。使用感はバッチリ。単純で良さがある。

計3日間ほど書いた Web API サーバー書いたので感想まとめとく。

  • チュートリアルがよく出来てて言語仕様もコンパクトなので初めての人でもすぐに書けるの最高。
  • シンプルなロジック書くには golang くらいの型システムでも気持よくかける。今回書いたものだと多相性とかなかったのでコンパイラの型チェックの恩恵受けながら気持よく書けた。
  • エラー処理で多値を返して片方の nil チェックとかするの書く前は厳しすぎるという先入観があったけど、書いてみるとそんなに書きづらくない。コード量は確実に多くてダルさはある。
  • ゼロ値と失敗表現がなんか微妙だなぁと思う。null にまつわる失敗表現の課題を解決したいのかな?って感じたけど、あんまり失敗をうまく表せてない気がする。あと失敗表現に一貫性がなくて気持よくない。os.Getenv で失敗した時は空文字列が返ってきてウッってなる。失敗を表現する型がほしい気がする。ただよく知られてるやり方だと合わないと思うから、golang っぽいなにかを期待している。
  • 多値を返しにくい設計の時に、失敗の時に nil 返して nil チェック忘れて実行時にアアッってなる場面が何回かあった。コンパイル時になんとかしたいと思う。「Go: The good parts」とか出たら bad parts の章で紹介されるような悪いパターンなのかもしれない。でも多値返したくない∧失敗したい∧ゼロ値だと不十分なケースはあるような気がする...
  • 圧倒的ライブラリ不足。業務アプリケーションを素早く書くのは厳しい。
  • 型まわりで不自由さを感じることが多い。型付けする楽しさが薄い。

個人的な不満はあるけど、言語としての思想は共感できるし書いてて楽しかったです。あとパフォーマンス意識して書かれた RoR アプリケーションを雑に書きなおして雑に10倍くらい速くて体験。