2016年9月19日月曜日

書籍「みんなのGo言語」

2016年9月に発売された「みんなのGo言語」を一読(厳密にはブログを書くため二読)しました。

他の日本語のGoの書籍と比べて、お財布に優しいお値段だし、ページ数も薄いし、IT雑誌のムックっぽい作りだし、読みやすそうだと思って入手してみると...q@w@p

Goの入門書を読み終えた方、Goをプログラミングしていて困った方、Goの知識を整理&確認したい方、そして、業務アプリをGoで開発したい&している方にオススメの内容かと思います。

以下、読書感想文ですが、本書を入手して実際に読み進めて頂きたいため、少しぼやかして書いています。あと、目線?着眼点?がおかしかったらすみませんm(__)m

各章について


第1章

松木さん:「みんなのGo言語」の執筆に参加しました
http://www.songmu.jp/riji/entry/2016-09-18-go-book.html

これからGoのコードを書いていくにあたっての内容です。

Goのプログラミングを進めていくにあたり、必要だったり便利だったりするツールやその使い方が紹介されています。ツールについては公式と独自のものがバランスよく紹介されています。

プロジェクトの作成、コーディング時の注意点、コードの検証、テスト、ビルド、モニタリングまでとGoで開発を進めるにあたっての一連の流れが解説されています。最初の頃はこの辺りで迷われる方も多いので良い指標となる内容です。

コーディング時の注意点については、2016年のISUCON予選でGoを選択した参加者がハマった件も書かれていますので、要チェック!? q@w@p

個人的には、他の章で書かれている内容については他の章に誘導することで役割分担であったり紙面の制約や内容の重複を上手く抑えられている&書かれていると感じました。

[補足]

本章ではパッケージ管理ツールにてGoをインストールしているため27ページの右側の上から2行目以降でGoのソースコードを別途入手していますが、公式サイトのインストーラーでインストールした場合はソースコードも一緒にインストールされます。

第2章

mattnさん:「みんなのGo言語」の執筆に参加させて頂きました。
http://mattn.kaoriya.net/software/lang/go/20160808013725.htm

マルチプラットフォームに対応させるにあたっての内容です。

Goは多くのOSに対応しているが無条件にOSの差分を吸収できている訳ではなく、意識して対応しなくてならないことがわかる章です。

ファイル操作に関して、標準パッケージの挙動の差異、クローズ処理、日本語の受け渡し、など注意すべき点が多く解説されています。

OS固有のGoコードの分け方、エスケープシーケンス、OS別のデーモン化、シングルバイナリー化、Windowsでの注意点、設定ファイルの扱い方、など幅広い範囲において公式および独自のパッケージを使った解決策が紹介されています。

個人的には、業務や自機でWindows、Mac、Linuxを使っているので差異の発生箇所や原因がイメージしやすく、また、自作する際には気を付けなければと、ためになる内容でした。

第3章

藤原さん:「みんなのGo言語」の執筆に参加しました
http://sfujiwara.hatenablog.com/entry/2016/09/09/000506

業務アプリを作成するにあたっての内容です。

実際のGo製の業務アプリをベースに必要となる機能や注意すべき点が紹介されているため、実践的で説得力のある内容となっています。

バージョン管理では、実行バイナリーへのバージョンの埋め込み方や、リリース後のバージョンアップを検知する方法などが紹介されています。

データの入出力に関しては、ファイル、HTTP、Amazon S3の3つのメディアからの入出力を軸として端末入力やログ出力も加えて、バッファリングやハッシュ化などデータを効率的に扱うためのノウハウが解説されています。

その他にも、乱数の生成、外部コマンドの呼び出し、タイムアウト、シグナルの扱い、goroutineの停止、など業務アプリとして必要となる機能が多く解説されています。

個人的には、タイムアウトやシグナルなど、まだまだ考慮しなければならない点があることに気付かせて頂いた章でした。

第4章

中島さん:(deeeetさーん、執筆ブログ、お手すきの時などに〜:q@w@p)

コマンドラインツールを作成するにあたっての内容です。

第1章でも紹介されていますがディレクトリー構成については本章でより多く解説されていますのでお見逃しなく!q@w@p

引数、終了コード、標準出力と標準エラー、エラーメッセージ、など、Go特有の話ではなく一般的にコマンドラインツールを作成する際に注意しなくてはならない要素が解説されています。

引数の扱い方として、Goとしては通常の引数とサブコマンドのパターンがあることが解説されており、サブコマンドに関しては多くの独自パッケージが紹介されています。

flagパッケージを使ったGoでの引数の取り扱い方が詳細に解説されていますので、ぜひ公式のパッケージドキュメントとソースコードと合わせて読み進めてください。

私自身、本書を購入する数日前にflagパッケージのドキュメントとソースコードを読み直していたため、めちゃくちゃ理解しやすかったです。

[補足]

102ページの左側の下から8行目以降にてエラー状況を英文で付加する際は文中に入ることも考慮して小文字で記述します。(CodeReviewComments - Error Strings)

第5章

牧さん:「みんなのGo言語」執筆参加しました!
http://lestrrat.ldblog.jp/archives/49260847.html

リフレクションを使うにあたっての内容です。

恥ずかしながら、どの言語しかり私は今までリフレクションを使ったコードを書いたことがないため「この章を読んでリフレクションを理解しよう!」と興味を持って読み進めました。

reflectパッケージの使い方、使わない方が良い理由、あえて使うときの局面、などが詳しく解説されています。

コードを解析する機能だけにコード例も多く掲載されているので、わかりにくいと感じられるところもコードと解説をじっくりと読み比べれば読み進めることができます。

後半に入るとポインターを扱う話が出てきますので、本章を読み進める際はGoの基礎を身につけてから挑んでください。

以前のGolang勉強会(togetter)の時にtenntennさんやsinmetalさんがreflectでコネコネしていた時の会話や言葉がやっと少し理解できました。

[補足]

サンプルコードにてメッセージの出力にprintln()組み込み関数を使っている箇所がありますが、print()組み込み関数と共に将来的なサポートが保証されていないため、fmtパッケージを使った出力に書き換えてください。(https://golang.org/ref/spec#Bootstrapping

第6章

鈴木さん:「みんなのGo言語」の執筆に参加しました
http://suzuken.hatenablog.jp/entry/2016/08/08/132303

テストを行うにあたっての内容です。

testingパッケージを使って行えられる、テスト、Examples、ベンチマーク、サブ系、テストメイン、について解説されています。

より実践的なテストとして、構造体の深い比較、競合の検出、Webサーバー、テストガバレッジ、などtestingパッケージだけでは対応できないテストの実施方法についても解説されています。

変数やインターフェースで既存の処理をテスト用の処理に置き換える部分ではGoらしさを感じとることができます。

個人的には、testingパッケージについては「Golang Cafe #1」での知識ベースのままだったので、テストメインの存在を新たに知るなど、リフレッシュする良い機会となりました。

全体を通じて


何らかの方向性?注意点?が読み取れるのではないかと思い、ざっくりとですが特徴や複数回でてきた内容を列挙します。

本書について

  • 本書はGoでコマンドラインツールを作成するノウハウを紹介している。
  • 執筆時点では正式リリースされていないGo 1.7の機能も積極的に紹介している。

著者について

  • 著者はGoで自作ツールなどを開発しておりOSSでGitHubに公開している。
  • 著者の多くがMakefileでビルドを行っている。

コンパイル時

  • コンパイル時には「_」などで始まるファイルは無視される。
  • 実行バイナリー作成時には -ldflags オプションでバージョンを埋め込む。

コーディング時

  • 全てをGoで処理するのではなく他のツールと連携する。
  • map型はスレッドセーフではない。
  • 処理によってerrorをそのまま返すのではなく適切なメッセージを添える。

テスト時

  • インターフェースを活用して実装を切り替える(例:プロダクションとテスト)
  • テストケースを用意する際は Table Driven Test を活用する。

読み進めるにあたって


よくわからないところはひとまず飛ばして、わかるところ・興味のあるところから読み進めれば良いでしょう。一通り読み進めた後、同様の問題に直面した時、本書を開いてみてください。

標準パッケージの内容が解説されている部分では、公式のパッケージドキュメントやソースコードにも目を通すことをオススメします。

余裕があったり、より理解を深めたい方は、本書のサンプルコードも動作させてみてください。

以上の内容を実施することで、Goへの理解度がぐんと深まるはずです。

みんなのGo言語 第n弾


もし第2弾、第3弾が発刊されるなら、次のテーマが含まれていたら嬉しいかも!? q@w@p

  • pprof、cgo、並列処理、AST、generate
  • GAE/Go、gomobile、GopherJS、gobot

P.S.三連休はみんGoで始まりみんGoで終わった...成果物はブログ記事1件と正誤報告8件!