Goで遊んでわかった3つの魅力
11/20 ~ 12/4 までの約2週間、サンフランシスコとシリコンバレーにいく予定の伊藤です。1週間は休暇を頂いて、もう1週間は現地でリモートワークを行う予定です。初めてのアメリカなのでワクワクしています!
1ヶ月前ぐらいから趣味でGo言語を書き始めたのですが、比較的すぐに飽きてしまう僕でも1ヶ月間割と楽しくコードを書き続けられているので、今回はそのGo言語の魅力をご紹介したいと思います。
Goを始めたキッカケ
僕がはじめてGoを書いたのは、前回の記事 で紹介した 自作ISUCON のベンチマーカーを作成したときでした。ベンチマーカーは並列で高速にHTTPリクエストを送信する必要があり、高速 に 並列実行 ならGo言語でしょう!という軽い気持ちで書き始めました。実際に書いてみると、構文を覚えただけで思った以上に感覚的に書くことができ、特にハマることもなく実装することができたので、かなり良い第一印象でした。
連射でGo!
その後、ある事情でコマンドラインからネットワークの回線速度を計測する必要があり、speedtest-cli というツールがあることを知りました。これは、ブラウザで回線速度計測を行う speedtest.net (の財産)を利用したコマンドラインツールなのですが、ソースコードを読んでみるとHTTPリクエストの送信アルゴリズムを改善できそうな感じがしたので、高速 に 並列実行 ならGo言語でしょう!ということで、Goでフルスクラッチで回線速度計測ツールを作成することにしました。
その成果物が showwin/speedtest-go なのですが、なんと speedtest.net の約半分の時間で回線速度の計測ができ、計測結果は既存ツールの speedtest-cli よりも精度が高い(=より speedtest.net で計測した値に近い)ものができてしまいました!
これは良いものができたぞ!!と思い、Go Conference 2015 Winter のセッション発表に応募してみました。11/6に採択/非採択の結果発表予定でしたが、まだ結果が来ず、発表できるのかどうかわからない状態です。。
Goの魅力
趣味プロダクトの宣伝みたいになってしまいましたが、ここから上記2つのプログラムを書いて分かったGoの良さを3つ紹介します。GoでHTTPクライアントしか書いていない人の意見なので、偏っているかもしれません。
凡人でも書ける並列実行
Goの並列実行には Goroutine というシンプルに設計されたものがあり、これを使うことで簡単に実装をすることができます。今まで並列処理を書いたことがない私でも、簡単な記述で実装ができるためいろいろと手を動かして動作を確認することができ、短時間で動きを理解をすることができました。
静的型付け言語
Javaを少しだけ書いていたことがありますが、大学時代からほとんどRubyを書いていたためGoの静的型付けは新鮮で、コンパイルでエラーチェックができることがどれだけ楽なことかを実感することができました。また、コンパイル時に、使用していない変数やライブラリのチェックも行っており、不要なコードがある場合にはエラーが発生するので、常に無駄のないキレイなコードを書くことができます。
コマンドラインツール作成に関連する豊富なライブラリ
Goは様々はOS向けのバイナリを生成するクロスコンパイルをサポートしていて、コマンドラインツールを作成するのに向いています。またそれを作成するためのライブラリも非常に豊富で、それらを使うことで非常に高速に開発をすることができます。例えば、私が作成した speedtest-go では13種類のバイナリを配布しているのですが、これもコマンドを1つ叩くだけですべてのバイナリが生成され自動的に GitHub で Release まで行ってくれる非常に便利なツール laher/goxc を使っています。
まとめ
まだまだ初心者でGoの使いドコロを把握しきれてはいないですが、なんとなくGoの良さはつかめてきたかなという感じがしています。新しいプロダクトの作成は一時停止して、次はGoのキレイなコードの書き方や、テストコードの書き方辺りを勉強したいなと思っています。
ちなみに、社内 Slack には #gopher チャンネルがあり、Gopher がたくさんいたり、下條さんが下郷さんになっていたりします。