TL;DR サンプルで学ぶ Go 言語というウェブサイトが生えた

このウェブサイトは Go by Example の日本語訳です。 これは Go のチュートリアルで、https://hackr.io/tutorials/learn-golang でも https://gitconnected.com/learn/golang でも、公式チュートリアル以外では 2019 年 4 月時点で一番高い評価がついています。

レベル感としては、公式のチュートリアル A Tour of Go を読んだ程度の知識(Go のプログラムを書ける、動かせる、基本的な文法がわかる)を前提にしていて、僕も Go 言語を学びたいと言っている人を見かけると公式チュートリアルを読んだあとこのウェブサイトを見ることをおすすめしています。

簡潔なサンプルが機能別に並んでいるので、一通り読みながら動かしてみて、Go の主要な機能やイディオムを一通り抑えて入門者を脱出することができます。 また、テーマ選定がめちゃめちゃ良くて、実際に使う要素が凝縮されているので、一度目を通しておくと「これって Go でどう書くんだっけ」と思ったときにサッと調べるときに便利です。

ソースコードは https://github.com/spinute/go-by-example で公開しているので、プルリクもぜひぜひ!

僕の Go 経験

ここ2年ほど言語を選べるときには Go を選ぶことが多いです。50行もないプログラムだと Ruby や Bash で済ますこともありますが、設計を考えたり、複数ファイルに分けたりしたくなったくらいで使うイメージです。

そういう場面では、これまでは C, C++, Erlang あたりを使っていましたが、最近好んで Go を使っているのはまあ Go が良い言語だと思っているからです。

ここ一年くらいだと、例えば以下の趣味プログラミングを Go でやってきました。

Go の好きなところ

こういうところが好き。

  1. 言語設計がシンプル
    • C 系の言語を知ってる人なら、チュートリアルを読んで3時間くらいで基本機能を把握できるはず
    • いろいろな機能がない。これは意図的なデザインで、単純な機能の組み合わせて実現できる機能は入っていないことが多い(参考:なぜGoにはXという機能がないのですか?
  2. エコシステムが整っていて、ツール周りがモダン
    • どのテストフレームワーク使うとか、コーディング規約はどうとか、ビルドツールがなにとかで、流行を追ったり勉強し直したりしなくてよい
    • 例えば gofmt が好き。Go ではコーディング規約があらかじめ決まっていて、規約を守ってないとコンパイルが通らない(!)。ただし、標準ツールを使って基本的に自動で修正できる
  3. 性能が良く、静的な型チェックがある
    • AtCoder やってて、今のところ Go だから通らない問題に当たったことがない(Ruby や Python だとたまにある)
    • 静的な型チェックの無い言語で、たくさんコード書いたり、共同開発したりするのは結構ツラい

自分が今まで一番腰を据えて勉強したのが C 言語なのもあって、個人的にはとにかく「better C」味を感じる。C に似てるから学習コストは小さくて、C のツラいところを言語デザインで潰してるのでそのコストが十分ペイする感じ。同じ人がしばらく時間を置いて作った言語だからなのかな。

型がお粗末って言われたり、なんでジェネリクスないんって言われたり、脳みそがあれば GC とかいらんでしょって煽らることもあるけど、僕は好きです。

良くないところ:(まだ)本が少ない

Go は良い言語だなと思う一方で、Go の本ってまだまだ少ないなと思ってます。

Go の公式のドキュメントは出来がよく、言語仕様やメモリモデルの説明、ツールや標準ライブラリのマニュアルなどはよく書かれています。しかし、「Go をどう使うか」系のドキュメントがまだまだ出揃っていないなと感じています。

例えば、デザインパターンとか OOP について知りたい人が、Java や C++ を読めないと読む本がないのはどうかと思うわけです。 別の言語にそのままお作法が適用できるわけでもないですし(継承とかないし)。

別に機械学習とか画像処理を Go でやりたいわけではないけどそういう本もあったら読みたいな、とは思います(「Go 言語でつくるインタプリタ」とか「Go 言語による並行処理」とか、少しずつ増えてるのは良い傾向)。

ただ現状として、他の言語で学んだ内容を Go に自分で持っていくしかないことが多いと思います。。 このとき、Go だとどう実装するの?とか Go でもこのパターンって有効なの?とか、色々な疑問が浮かぶと思います。このようなギャップを生じない、Go のために書かれた本があると知の高速道路として言語の普及に繋がることもあるわけで、これが他のメジャー言語と比べて今の Go(の特に日本コミュニティ)にまだまだ足りていないところだと思います。

Go ならわかるシステムプログラミングはきっとそういうモチベーションの本なのだと僕は思っています。 Go はシステムプログラミング言語だって聞くけど、それって実際どうやるのっていうギャップを見事に説明していて、C/C++ の独壇場に Go をぶっ刺して広げていくためには、こういう本が必要なんだろうなと思います。

あと、日本の Go 界隈の動向よくわかってないんですけど、一番大きなポータルサイトっぽい http:/golang.jp が何年も更新止まっているのが気になっています。このサイトでは Go の公式ドキュメントのかなりの部分(?)を翻訳して公開しているのですが、もう更新されていないのでしょうか…?

翻訳した

さて、色々脱線してしまいましたが、入門者向けの資料が日本語に翻訳されていることは、そのコミュニティの間口を広げるために大切だと僕は思っています(みんなのデータ構造を翻訳した動機も同じ)。

そのため、僕が Go に入門するときに読んでいた Go by Example というウェブサイトを日本語にして置いておくことにしました。

このチュートリアルはトピックの選定がめちゃめちゃ上手で、Go でやりたくなることの8割をカバーできる情報が、コンパクトに、かつサンプルコード付きで載っています (どのくらいコンパクトかというと、旅行に行って帰ってくる間に翻訳し終えたくらい)。

これは自分が Go のチュートリアルを漁ってきた中で一番良かったと思うものもので、例えばhttps://hackr.io/tutorials/learn-golang でも https://gitconnected.com/learn/golang でも、公式のチュートリアルを除くと 2019 年 4 月時点で一番高い評価がついています。

ソースコードは https://github.com/spinute/go-by-example で公開しているので issue やプルリク、質問等もぜひ送りつけてください! まだざっと翻訳したっきりなので、いつか時間とって見直しをしたい…。