改訂2版 みんなのGo言語
松木 雅幸 (著), mattn (著), 藤原 俊一郎 (著), 中島 大一 (著), 上田 拓也 (著), 牧 大輔 (著), 鈴木 健太 (著)
技術評論社 (2019/8/1)
売り上げランキング: 5,929

幾人かの著名な方々が、それぞれの章を執筆した形式の書籍となっている。

いわゆる入門書のような基礎文法の解説ではなく、現場でも使える or 使っているテクニックや環境構築などが解説されている。

A tour of Go を一通りやった後に読むとよい。

目次

第1章 Go によるチーム開発のはじめ方とコードを書く上での心得(松木雅幸)

いくつか便利なコマンドラインツールを紹介していたので抜粋する。

コマンドラインツール

  • Go の REPL 環境 gore
1
$ go get -u github.com/motemen/gore/cmd/gore

コードフォーマッター gofmt

Go には標準で gofmt というフォーマッターが付いている。 これはインデントや改行位置、変数の整列などを自動調整してくれるツールである。

以下のようにして使う。(実際は VSCode などに保存時に自動実行されるような設定をいれる)

1
$ gofmt -w main.go # -w オプション: 対象のファイルを整形後の内容で上書きする

lint ツール

Go には標準で lint ツールが付いている。

  • go vet はバグの原因になりそうなコードを検出する。
  • golint は Go らしくないコーディングスタイルに対して警告を出す。

リネームツール gorename

1
$ go get golang.org/x/tools/cmd/gorename

ソースコード解析ツール guru

1
$ go get golang.org/x/tools/cmd/guru

Language Server Protocol

1
$ go get golang.org/x/tools/cmd/gopls

ディレクトリ名とパッケージ名

Go はディレクトリ単位でパッケージが切られる。

main を除き、ディレクトリ名はパッケージ名と同一であることが強く推奨される。

ファイル分割

Go は1つのパッケージディレクトリ階層内に複数のソースコードを配置できる。 同じ階層のコード内の package 宣言はすべて同じである必要がある。

ファイル分割は任意で構わないが type(型) を定義してそれに対するメソッド定義を1つのファイルに切り出すなどするとよい。

パッケージ分割

クラス定義の階層と名前空間が対応しているプログラミング言語は多いが、Go はその感覚でパッケージ分割してはいけない。

パッケージの中で利用されるコンポーネントの類は type を定義して type ごとにファイルを分けるのが良い。

単独のライブラリとしてほかのプロジェクトから使えるかどうかがパッケージを分割する基準になる。 たとえばロガーパッケージをサブパッケージとして分割するなど。 またサブパッケージのインポートには絶対パスを使う。

e.g. import "my.example.com/path/to/myproj/logger"

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

マルチプラットフォームで動作させるコツなど。

パスの違いを吸収する

Windows と UNIX のパスの違いを吸収するために path/filepath を使う。

積極的にdeferを使う

回収すべきリソースがあり、かつ後処理を実行すべき順番が決まっている場合。

1
2
3
4
e.g.
  tmp dir を作る
  tmp dir にファイルを作る
  tmp dir を削除する

このような場合、ファイルストリームを閉じてからディレクトリを消さなければいけない。 Go では defer を使用すると呼び出したスコープを抜ける際に、呼び出された順番とは逆の順番で実行される。

シングルバイナリにこだわる

シングルバイナリのメリットはデプロイの簡略化にある。

Web アプリのようにテンプレートファイルや画像などを設置することでデプロイの手間が増えてしまわないようにアセットツールを有効活用する。

有名なアセットツール

  • statik
  • packr
  • go.rice

第3章 実用的なアプリケーションを作るために(藤原俊一郎)

実用的なアプリケーションを作るためのテクニックなど。

効率的なI/O処理

入出力では bufio でバッファリングを行う。

人間が扱いやすい形式の数値

go-humanize を使う。

1
$ go get github.com/dustin/go-humanize

第4章 コマンドラインツールを作る(中島大一)

コマンドラインツールを作る際のテクニックなど。

ディレクトリ構成

バイナリをメインとするか、ライブラリをメインとするかでオススメの構成が変わる。

  • バイナリをメインとする場合のディレクトリ構成
1
2
3
4
5
6
$GOPATH/src/github.com/tcnksm/todo
|- main.go           # package main
|- main_test.go      # package main
|- lib/
    |- todo.go       # package todo
    |- todo_test.go  # pacakge todo
  • ライブラリをメインとする場合のディレクトリ構成
1
2
3
4
5
6
7
$GOPATH/src/github.com/tcnksm/todo
|- todo.go               # package todo
|- todo_test.go          # package todo
|- cmd/
    |- todo/
        |- main.go       # pacakge main
        |- main_test.go  # pacakge main

サブコマンドを持ったCLIツール

本書内ではサードパッケージについて、いくつか紹介していた。

個人的には spf13/cobra がいいと思う。

第5章 The Dark Arts Of Reflection(牧 大輔)

reflect パッケージに関するテクニックなど。

第6章 Goのテストに関するツールセット(鈴木健太)

test やベンチマークに関するテクニックなど。

第7章 データベースの扱い方(mattn)

Go でデータベース扱う方法についての解説がされていた。ORM の紹介などもある。

フレームワーク echo の紹介などもある。