Johnman.md

プログラミングのことや個人的なことを書きます。たぶん。

みんなのGo言語 改訂2版がすごくよかった

先日、みんなのGo言語 改訂2版を読み終えました。

実は1版の方も一度購入していたんですよね。ただその時はまだ本格的にGoを書いたこともなく、そもそもGoで何ができるかもよく知らないという状態だったので全然内容に関心がわかず、読まないままでした。

しかし、就職して業務でGoを書くようになってから1年以上経ちました。 最近自分が書いているコードに関しても「もっといい書き方はないか」と考えることも増え、さらにGoを使ってなにか個人的な開発をしたいと(漠然とですが)思うまでになりました。 今ならこの本を楽しんで読めるのではと思い、手に取った次第です。

ここでは個人的にいいなと思った点をまとめていきます。

みんなのGo言語 改訂2版

概要

本書は、複数のエンジニアの方々*1が書かれた共著本です。全体を通してGo言語の文法などには触れておらず、各著者が業務でGoを活用する上のノウハウが書かれています。 そのため、ある程度Goの言語仕様を理解している方が読みやすいと思います。

個人的に求めていたものがGoを実践的に使うノウハウそのものだったので、非常にハマりました。

ちなみに普段書籍はKindleで買うのですが、今回は手でパラパラとめくることが多そうな本だったので紙媒体で購入しました。

構成

本書は全7章で構成されています。

第1章. Goによるチーム開発のはじめ方とコードを書く上での心得
第2章. マルチプラットフォームで動作する社内ツールのつくり方
第3章. 実用的なアプリケーションを作るために
第4章. コマンドラインツールを作る
第5章. The Dark Arts Of Reflection
第6章. Goのテストに関するツールセット
第7章. データベースの使い方

このうち第7章は2版から追加されたものです。

面白かったところ

どの章も非常に面白かったです。 ここでは特に面白いと思ったところを挙げていきます。

Goでマルチプラットフォームに対応する

これは第2章で取り上げられている内容です。GoはWindowsLinuxといった異なる環境に対してもほぼ同じ実装を使うことができますし、各OS向けのビルドができるためランタイムを実行環境にインストールしたりする必要がありません。

しかし、実際にはある程度のルールがあり、それを守らないとマルチプラットフォームで動作させることはできません。 たとえばディレクトリのパス解決にはpathパッケージではなくてpath/filepathパッケージを使おうとか、runtime.GOOSが使えるよとか、そういう話です。

なぜこの章が面白かったかというと、まさにここで書かれているようなOSごとの実装を最近見ていて個人的にタイムリーだったからです。 最近まで社内勉強会の一環として、Futureさんのテックブログ*2を参考に、Goの標準パッケージのコードリーディングを行っていました。そこで見た(上述した)path/filepathパッケージ*3がまさにOSごとに実装されていました。 OSを超えてよしなに使えるパッケージだからそりゃOSごとに実装されているよねという話ではあるんですが。

ちょうどタイムリーな話題だったので印象に残りました。また純粋に自分でコマンドを配布したいような場合にはどうしてもマルチプラットフォームに対応する必要があるので、役立つし非常に面白かったです。

ちなみにGoの標準パッケージリーディングは面白いのでおすすめです。社内でよく使うライブラリでもいいかもしれませんね。

コマンドラインツールの作り方

これは第4章で取り上げられている内容です。GoはCLIツールをとても作りやすいです。前述したように複数プラットフォームへも対応しやすく、配布そのものも簡単です。もちろんpure Goでも書くことができますが、より開発しやすいように様々なサードパーティ製のパッケージが存在しています。 この章ではまずGoの標準パッケージを使った実装方法が紹介された後、サードパーティ製パッケージの紹介、CLIツールの実装方法が書かれています。

ぼくが初めてGoで開発したものがCLIだったので興味が湧きました。ちなみにその際はspf13/cobra*4を使って実装しました。 しかし今回面白いと感じたのは、ここで紹介されていたmitchellh/cli*5を使った実装です。

spf13/cobraは構造体に名前や使い方、実際の処理を追加していくことでコマンドを実装するのに対し、mitchellh/cliはコマンドをインターフェースとして定義するのが面白いなぁと感じました。 ただflagが使えないので使い勝手はあんまりよくなかったりするのかもしれません。

reflectパッケージ

これは第5章で取り上げられている内容です。GoにはReflection機能を提供するreflectパッケージがあります。ぼくの中でreflectといえば、「型を失うやべーやつ。手を出すな」くらいの認識しかありませんでした。

具体例と一緒にreflectパッケージの使い方が書かれていて、とてもわかりやすいです。また使用する際にハマりやすいポイントについても詳しく書かれていて、非常に参考になります。

実際に業務でも書くことがなかったので、改めて使い方や実装を知ることができたのは非常によかったです。ちなみにreflectは標準パッケージでも結構でてきたりしました。けどできれば書きたくないですね。

まとめ

簡単にではありますが、みんなのGo言語を読んで面白かった点を書いてみました。 人の経験から得られるノウハウはやっぱり参考になるなぁと実感します。

Goがある程度書ける、Goで何か作ってみたいという人にはとてもおすすめの本なのでぜひ手にとって読んでみてください。