My External Storage

Aug 4, 2019 - 6 minute read - Comments - review go

[書評] 改訂2版 みんなのGo言語はGo言語入門者にも初版所有者にもオススメな1冊

@tenntennさんに献本していただいたので、改訂版2版みんなのGo言語(通称みんGo)の感想をまとめる。
なお、私は初版も持っているので、「前の持っているしどうしよう?」という方向けに初版との比較も記載する。

表紙画像

所感

端的に言うとGoの開発をするときPCの隣に置いておきたい1冊だ。
言語仕様を読んだりTour of GoをするだけではわからないTipsやベストプラクティスがふんだんにまとまっている。
「今年はGoやるぞ!環境構築してCLIツールかTODOアプリのWEBページでもテスト書きながら作ってみよう。」という人はこの一冊があれば十分だろう。

初版を持っている方でも、もう一度買って十分得する本だと思う。私は持ち歩かなくてもよいように電子書籍版も購入した(初版の物理本・電子書籍も合わせると4冊?所有していることになる)。
後述するが、改訂2版では主に以下の点が更新されており、ページで言うと初版から20ページほど増量されている。

  • Go1.7以降に追加された仕様への言及
  • 2016年から2019年の間に移り変わったOSSトレンドの追従
  • Go Modulesの使い方
  • database/sqlを使ったデータベース操作
  • 簡単なWebアプリケーションの実装サンプル

どんな本なのか

本書は2016年に発売されたみんなのGo言語の改訂版である。1版は16年9月に発売されたのでほぼ3年経っての改訂である。
初版のころからGoを今から始める人に非常にオススメの本で、この本1冊で以下のようなコトがわかる。

  • motemen/ghqなどを使った環境構築方法やGopher(Go利用者)の多数が利用しているであろうインストールしておきたい便利な開発ツール
  • マルチプラットフォーム、サブコマンドやオプション対応を実装した実践的なCLIツールの作成方法
  • バッファリングやgoroutine処理、リフレクションなどの一工夫必要な実装の解説
  • Racce DetectorやTestMain関数を使った一連のGoのテストの書き方
  • database/sqlを使ったデータベース操作と簡単なWebアプリケーションの作成方法(改訂2版で追加)

本書は網羅的に言語仕様をカバーする類の本ではないが、OSSのコード・業務コードを読んだときに「何やっているんだろう?(なぜこうする必要があるんだろう?)」と疑問に思うようなことはほとんど押さえてあるだろう。
日頃Goの情報にアンテナを張っているような人でないと知らない内容もあったりするので、初級者以上でも知らないことがないか読んだほうが良いだろう。

初版と改訂2版の違いについて

初版と比較して改訂2版では以下の更新・追加が行われた。

Go1.7以降に追加された仕様への言及

2016年に発売された初版当時のGoのバージョンは1.6だった。そのため、初版発売以降に追加されたGoの仕様に対する言及が各ページに追加されている。

  • 1.3 Goを始める Go1.11から試験導入されているGo Modulesについて
  • 2.8 設定ファイルの取り扱い Go1.12から追加されたos.UserHomeDir関数について
  • 3.8 goroutineの停止 Go1.7から追加されたcontext.Contextを使った外部からのgoroutineの停止
  • 6.2 testingパッケージ入門 Go1.10で追加されたテストキャッシュについて
  • etc…

2016年から2019年の間に移り変わったOSSトレンドの追従

どの言語にもデファクトスタンダードになっているOSSがあるだろう。本書でも多数のOSSが紹介されている。
改訂2版では新しいOSSの紹介や3年間で移り変わってトレンドが反映されている。

  • 1.2 エディタと開発環境 新進気鋭の公式LSPのgoplsの紹介
  • 2.6 シングルバイナリにこだわる 初版で紹介されていたが、メンテがされなくなったjteeuwen/go-bindataではなく、rakyll/statikに変更

Go Modulesの使い方

2019年現在、Goの依存パッケージ管理といえばGo1.11から試験導入され始めたGo Modulesだろう。Go1.13ではgo.modファイルさえ置いておけば自動で有効になる。

初版ではglideを使ったパッケージ管理方法が紹介されていたが、改訂2版でgo modを使ったGo Modulesに置き換わっている。
(雑誌を除く)日本語の書籍でGo Modulesを使った方法を言及している書籍ははじめてではないだろうか。

database/sqlを使ったデータベース操作と簡単なWebアプリケーションの実装サンプル

改訂2版で追加された第7章ではデータベース操作の基本が説明されている。 7章も大変実践的で、単純な公式パッケージの説明だけでなく、以下のような業務で使うときに一度は悩むことが丁寧に解説されている。

  • sql.NullString型を使いつつJSON Marshalingに対するためのTipsや対応しているOSSの紹介
  • ORMを使ったデータベース操作
  • データベースを操作するWEBアプリケーションの作成

初版ではWEBアプリケーションを作るような章はなかった。
この1冊でCLIツールとWEBアプリケーションの作成を試せるようになったという点でも7章が追加された意味は大きいと思う。

少し気になったこと

全体的に大満足なのだが、気になるところがなかったわけではないので、その点も記しておく。

sync.Mapの紹介があってもよかったかも?

1.4 Goらしいコードを書くの中のmapを避けるの節では、スレッドセーフではないmapを使うためにsync.RWMutexを利用したマップの実装が記載されている。
排他制御の実装例として良いと思うのだが、Go1.9からはsync.Map型が追加されているので、sync.Mapへの言及があってもよいと思う。

表記が章ごとにまちまち

書籍の中では全体的に関数名や変数などのキーワードは太字の文字装飾がされている。一部の関数名が太字になっていなかったところがあった。
また、本書は章ごとに著者が異なる本である。章によってはSetup関数io.Writerのように、太字のキーワードが関数なのか?型なのか?などまでしっかり記載されている。
初心者ほど名前を見ただけでは関数なのか変数なのかわからないので、全部の章でキーワードの種類も書いてあるともっと読みやすくなるのでは?と思った。

終わりに

主に改訂された内容についての言及が多くなってしまったが、改訂2版 みんなのGo言語について感想をまとめた。
個人的な話をすると献本したいただいたのははじめてだったので、そういった意味でも私に大事な1冊となりそうだ。

関連記事