A Tour of Goを終えたあなたにおすすめのGoを勉強するためのリソース
今年も夏のインターンで学生にGoの講義をします。多く寄せられる質問が「A Tour of Goを終えたのですが、その後に何をやるのがおすすめですか?」というものです。学生に限らず、言語を学ぶ方はプログラミングそのものに対する慣れやバックグラウンドも違います。そこでなるべくいろんな方の参考になるように、おすすめな本なりページなり方法なりをまとめてみます。
わりと多くの人におすすめ
「プログラミング言語Go」(Alan A.A. Donovan, Brian W. Kernighan著)です。通称GOPL。
柴田さんによる日本語翻訳もあります。
https://www.amazon.co.jp/dp/4621300253
Go言語のイントロダクションから始まり、型・インタフェース・並列性の説明などが丁寧にかかれています。私がGOPLを良いと思う点は、例示が豊富なところです。Goのインタフェースはとても強力ですが、最初その有用性をどのように活かせばいいかというのはちょっとした応用のコツを抑える必要があります。GOPLでは例を交えながら説明されているので、とてもわかりやすく、実践的です。例えば7.9では簡単な評価器をつくります。以下のような簡易電卓を実装します。
sqrt(A / pi) pow(x, 3) + pow(y, 3) (F - 32) * 5 / 9 (7.9 Example: Expression Evaluator より抜粋)
これらの式に対するパーサをどのように実装していくか、というのがわかりやすく説明されています。単項演算、二項演算の型を定義し、式をインタフェースとして定義します。
type Expr interface{ Eval(env Env) float64 }
この例では浮動小数点演算のみサポートしています。各演算はすべて Expr
のインタフェースを満たします。これにより、評価器の環境モデルをわかりやすく記述できるようにしています。
評価器の実装はインタフェースの演習の一例です。機能性を知り、理解を深めるために良い例だと私は思います。またGOPLでは、テストの実践例、豊富なGoのツールセット、Reflectionなどについても扱われており、私が知る中で日本語で読める書籍だと最も網羅的に書かれている本です。
もっと言語自体を深く知りたい方におすすめ
言語自体の理解を深めるには golang.org に載っているコンテンツを読み込むのがおすすめです。Goチームはドキュメントをとても重視していて、どの文章もよく書かれています。godocもその文化の一例です。
- 言語仕様: The Go Programming Language Specification - The Go Programming Language
- Effective Go: Effective Go - The Go Programming Language
- Goのメモリモデル: The Go Memory Model - The Go Programming Language
Goチームの書いているブログはどの記事も言語機能及び応用に関する解説として秀逸です。
The Go Programming Language Blog
ymotongpooさんが日本語訳を公開してくださっています。
個人的に好きな記事をあげておきます。
- Toward Go 2 - The Go Blog
- Error handling and Go - The Go Blog
- Arrays, slices (and strings): The mechanics of 'append' - The Go Blog
- Go Concurrency Patterns: Pipelines and cancellation - The Go Blog
- The Laws of Reflection - The Go Blog
- Errors are values - The Go Blog
- Go Slices: usage and internals - The Go Blog
また、Goの標準ライブラリを読み進めるのがおすすめです。言語仕様を読みつつ、「どう実装してるんだろう」と想像しながらコードを読み進めていくと楽しいです。Goの標準ライブラリはGoで書かれているので、読みやすいというのも嬉しいところです。
標準ライブラリを読むときはテストコードを読むとさらに理解が深まります。Goの標準ライブラリのテストコードは、そのライブラリをどのようにつかうかという視点でみたときによいサンプルになります。例えば、 encoding/json
を深く知りたいときには、
https://golang.org/src/encoding/json/encode.go を読みつつ
https://golang.org/src/encoding/json/encode_test.go を読むとわかりやすいです。 Examplesとして書かれたテスト はgodocにも載っているので、そちらも参考になります。
Webエンジニアで*1実践にGoを使ってみたいというあなたにおすすめ
Goの本ではないのですが、「Real World HTTP」(渋川よしき著)を個人的におすすめします。
内容紹介より引用します。
本書はHTTPに関する技術的な内容を一冊にまとめることを目的とした書籍です。HTTP/1.0、HTTP/1.1、HTTP/2と、HTTPが進化する道筋をたどりながら、ブラウザが内部で行っていること、サーバーとのやりとりの内容などについて、プロトコルの実例や実際の使用例などを交えながら紹介しています。 GoやJavaScriptによるコード例によって、単純なHTTPアクセス、フォームの送信、キャッシュやクッキーのコントロール、Keep-Alive、SSL/TLS、プロトコルアップグレード、サーバープッシュ、Server-Sent Events、WebSocketなどの動作を理解します。 これからウェブに関係する開発をする人や、これまで場当たり的に学んできた人にとって、幅広く複雑なHTTPとウェブ技術に関する知識を整理するのに役立ちます。HTTPでは日々新しいトピックが登場していますが、本書によって基礎をしっかりと押さえることは、さまざまな新しい技術をキャッチアップする一助にもなるでしょう。
夏のインターンでも学生向けにGoの話だけではなく、Webに関わるエンジニアとしてHTTPに関する講義を設けています。Real World HTTPはHTTPについて仕様を紹介するだけでなく、実際に動かす例を示しながら読み進めることのできる稀有な本です。また、HTTPの進化の過程を知ることもできますし、セキュリティに関わるトピックも丁寧に説明されています。Real World HTTPのコード例はサーバ実装、クライアント実装ともにGoが使われています。もちろん主眼はHTTPを学ぶことにありますが、GoでどのようにこのHTTPの機能を使うのか?というときに逆引きするのにも便利だと思います。
実践的なTipsをもっと知りたい方におすすめ
手前味噌ですが去年執筆に参加させていただいた「みんなのGo言語」、おすすめです。*2
そして何より
どんどん手を動かしてコードを書きましょう :)
思いつくまま挙げてみました。他にももしおすすめの本やリソースなどがあればコメントいただけると幸いです。