$shibayu36->blog;

株式会社アンドパッドでエンジニアをしています。プログラミングや読書のことなどについて書いています。

「みんなのGo言語」を読んだ

Go言語の学習のため、A Tour of Goに引き続き、「みんなのGo言語」を読んだ。

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]


「みんなのGo言語」はGo言語を実践的に使うためのTipsがいろいろまとめられていて非常に良かった。Go言語のA Tour of Goをやったけど、次にどうすればよいかわからない、具体的にGoの良い書き方が分からないという人が読むと非常に勉強になりそう。

僕はまだGoをそこまで書いていないので、「第1章Goによるチーム開発のはじめ方とコードを書く上での心得」と「第4章コマンドラインツールを作る」が非常に参考になった。例えば以下のようなものが参考になった(数字はKindleのロケーション番号)。

  • Goプロジェクトのプロジェクト構成やディレクトリ構成 519, 2389
    • バイナリをメインの成果物とする場合と、ライブラリをメインの成果物にする場合の二種類
    • 第1章、第4章両方で言及されている
  • 依存管理をするためのglideというツールの使い方 563
  • Makefileの具体例 609
  • Goらしいコード 656
    • panicを使わず、errorをちゃんと返す
    • 正規表現を避けてstringsを使う
    • mapではなくちゃんとstructを定義する
  • Build Constraintsやビルドタグを使って、ビルド対象のソースコードを切り替える手法 776
  • CLIを作るためのライブラリの使い方
    • flagパッケージ 2432
    • mitchellh/cliの使い方 2771
  • main関数に書くような主な処理はRun関数を定義してそこに記述し、Run関数はExitを呼ぶのではなく、そのステータスコードを返す 2926
  • CLIステータスコードのテスト手法 3016
  • CLIの出力メッセージのテスト手法 3034


この本を読んで、なんとなくGo言語に対する素地が出来たように思うので、次は 「みんなのGo言語」が良かったので、自分のためだけのCLIツールを作ってみた - えいのうにっき を見習って、簡単なCLIツールを作って学習を進めていきたい。

読書ノート

1章 Goによるチーム開発のはじめ方とコードを書く上での心得

  • goimportsを高速化するためのdragon-imports 407
  • Goはディレクトリ単位でパッケージが切られるため、mainパッケージを除き、ディレクトリ名はソースコード内に記述されるパッケージ名と同一であることが強く推奨されている 512 ※
  • Goプロジェクトのディレクトリ構成の代表的な一例 519
    • トップレベルはGoのパッケージとして利用される
    • cmd/以下にバイナリビルド用のmainパッケージが配置される
    • サブパッケージが必要な場合はディレクトリを掘る
    • Makefileをビルドのほかタスクランナー的に使う
    • 他の構成が2371にもある
  • ファイル分割は任意で良いが、typeを定義する場合、typeごとに1つのファイルに切り出すという良いプラクティスがある 527
  • 依存管理ができるglide 563 ※
    • govendorというツールもある
  • Makefileの参考になる例 609
  • Goらしいコード 656
    • panicを使わず、errorをちゃんと返す
    • 正規表現を避けてstringsを使う
    • mapではなくちゃんとstructを定義する
  • goのbuildの方法 776
  • Build Constraintsやビルドタグを使って、ビルド対象のソースコードを切り替える手法 776

基本として押さえておきたい

2章 マルチプラットフォームで動作する社内ツールのつくり方

  • runtime.GOOSに実行されるOS名が格納されている 1130
  • Build Constraintsの指定方法いろいろ 1142
    • ファイル名による指定
    • +buildコメントによる指定

3章実用的なアプリケーションを作るために

  • バージョン番号をバイナリに埋め込む 1534 ※
    • go build -ldflags
  • goでのIOのバッファリング 1602
  • 複数の出力先に一気に書き込む 1798
  • Goからos/execパッケージを利用して外部コマンドを実行する 1961
  • タイムアウトの実装 2048
  • シグナルを扱う 2109
  • goroutineを外部から停止する 2200

ツールを作る時にこれどうやるんだろうと迷った時に参考になりそう

4章コマンドラインツールを作る

かなり参考になった。とりあえずGoを学ぼうとすると簡単なCLIを作ってクロスビルドしてみるのが手っ取り早い気がするので、この章は参考になる。

  • リポジトリ構成 2389 ※
    • バイナリをメインの成果物とする場合
    • ライブラリをメインの成果物とする場合
  • flagパッケージ 2432
  • mitchellh/cliの使い方 2771
  • main関数に書くような主な処理はRun関数を定義してそこに記述し、Run関数はExitを呼ぶのではなく、そのステータスコードを返す 2926 ※
    • mainではRunを起動してos.Exitするだけ
    • os.Exitが呼ばれて後処理が行われないなどの問題が避けられる
    • テストもしやすい
  • ステータスコードのテスト 3016
  • 出力メッセージのテスト 3034

5章 The Dark Arts Of Reflection

動的に型情報を使うためのTips。必要になったらちゃんと読む。

6章 Goのテストに関するツールセット

  • testingパッケージ入門 3746
  • ベンチマーク入門 3853
  • reflect.DeepEqual 3973
  • テストにおける変数または手続きの置き換え 4105
    • モックの手法