みんなのGo言語 改訂2版
技術評論社
著者:松木雅幸、mattn、藤原俊一郎、中島大一、上田拓也、牧大輔、鈴木健太
改訂にあたって
はじめに
第1章 Goによるチーム開発のはじめ方とコードを書く上での心得(松木雅幸)
迷いなくGoを書き始めるために
1.1 開発環境の構築
インストールから環境設定まで
Goインストール
GOPATHの設定
go getによるパッケージのインストール
GoのREPLであるgoreを使う
プロジェクト管理のためにghqを導入する
pecoでリポジトリ間の移動を簡単に
Go製ツールのインストールについて
1.2 エディタと開発環境
コードフォーマッター、lintツールからドキュメント閲覧まで
Goとエディタ
開発支援用のツールを見る
コードフォーマッター~gofmt
コードフォーマッター+imports文 補助~goimports
lintツール~go vetとgolint
ドキュメント閲覧ツール~go docとgodoc
そのほかの便利なツールやパッケージ
1.3 Goをはじめる
start a tour of Go
学習~Tour of Go
プロジェクトを始める
ディレクトリ名とパッケージ名
ディレクトリ構成
依存管理~vendoringとModules
タスクランナーとしてMakefileを使う
1.4 Goらしいコードを書く
Goに入ってはGoに従え
よりGoらしいコードを書くために
panicを使わずに、errorをちゃんと返し、エラーチェックを確実に行う
正規表現を避けてstringsパッケージを使う
mapを避ける
reflectを避ける
巨大なstructを作らず継承をさせようとしない
並列処理を使い過ぎない
Goのコードを読もう
テストとCI
ビルドとデプロイ
モニタリング
まとめ
第2章 マルチプラットフォームで動作する社内ツールのつくり方(mattn)
Windows、Mac、Linux、どの環境でも同じように動作するコードを書こう
2.1 Goで社内ツールをつくる理由
みんな違っていて当然
さまざま環境への対応がせまられる
Goを採用する利点
2.2 守るべき暗黙のルール
OS間の移植をあらかじめ想定する
積極的にpath/filepathを使う
積極的にdeferを使う
積極的にUTF-8を扱う
2.3 TUIもWindowsで動かしたい
termboxとgo-colorable
簡単にTUIアプリケーションが作れるtermbox
go-colorableの使い方
2.4 OS固有の処理への対応
runtime.GOOSとBuilds Constraints
runtime.GOOSを使う
Build Constraintsを使う
pkg-configを使って複雑なコンパイルオプションに対処
2.5 がんばるよりもまわりのツールに頼る
ひとつのアプリケーションにひとつの仕事
Goアプリケーションのデーモン化
Linuxの場合
UNIXの場合
Windowsの場合
2.6 シングルバイナリにこだわる
アセットツールの活用
Goはシングルバイナリ
statikを使う
packrを使う
2.7 Windowsアプリケーションの作成
いろいろなユーザを想定する
Windowsアプリケーションの作り方
2.8 設定ファイルの取り扱い
マルチプラットフォームでの注意
設定ファイルを扱うときの注意
どのフォーマットにするか
設定ファイルをどこに置くか
JSONをきれいに吐き出す
2.9 社内ツールのその先に
マルチプラットフォーム対応アプリのメリット
一度作ったらそれで終わりではない
第3章 実用的なアプリケーションを作るために(藤原俊一郎)
実際の開発から見えてきた実践テクニック
3.1 はじめに
実用的なアプリケーションの条件とは
実用的なアプリケーションとは
本章で紹介するテクニック
3.2 バージョン管理
利用者が確認しやすくする
バージョン番号をバイナリに埋め込む
go-latestによる最新バージョン検知
3.3 効率的なI/O処理
バッファリング、コンテンツの取得、ファイルの保存
bufioで入力をバッファリングして扱う
bufioで出力をバッファリングする
go-isattyで出力先が端末かどうかを判別する
複数のソースから同じようにコンテンツを取得する
複数の出力先に一度に書き込む
3.4 乱数を扱う
math/rand、crypto/rand
乱数を扱う例
乱数を扱う標準パッケージ
3.5 人間が扱いやすい形式の数値
go-humanize
go-humanize
表記変換とパーサ
3.6 Goから外部コマンドを実行する
os/execパッケージの活用
外部コマンドを実行する利点
os/execパッケージ
os/execパッケージの使用例
外部コマンドをシェル経由で起動する(UNIX系の環境のみ)
go-shellwordsでコマンドライン文字列を解釈する
3.7 タイムアウトする
パッケージの機能とcontextの利用
使用するパッケージにタイムアウト機能が用意されている場合
contextパッケージの利用
3.8 シグナルを扱う
並行処理、非同期実行のハンドリング
goruntimeを外部から停止する
3.9 goroutineの停止
適切にハンドリングするために
Goシグナルを扱う
独自のシグナルを定義する
まとめ
第4章 コマンドラインツールを作る(中島大一/上田拓也)
実用的かつ保守しやすいコマンドラインツールを作ろう
4.1 なぜGoでCLIツールを書くのか?
3つの利点
GoでCLIツールを書く利点
メルカリにおける実例
4.2 デザイン
インターフェースとリポジトリ構成
CLIツールのインターフェース
リポジトリ構成
4.3 flagパッケージ
コマンドラインオプションを活用する
flagパッケージとは
基本的な使い方
いくつかのテクニック
内部実装とカスタマイズ
応用的な使い方
サードパーティ製のパッケージの紹介
4.4 サブコマンドを持ったCLIツール
サードパーティ製パッケージの活用
サードパーティ製パッケージの紹介
mitchellh/cliの使い方
4.5 使いやすく,メンテナンスしやすいツール
長く利用されるパッケージにするために
使いやすいツール
メンテナンスしやすいツール
まとめ
第5章 The Dark Arts Of Reflection(牧 大輔)
不可能を可能にする黒魔術
5.1 動的な型の判別
実行時まで型の判別を待つには
型の検出と型アサーションの限界
5.2 reflectパッケージ
型情報の取得と操作
reflectパッケージを使って得られる情報
reflect.Value
型により動作を変える
reflect.Type
structをパースする
5.3 reflectの利用例
ハマらないためのレシピ集
値を動的に生成する
見える範囲・見えない範囲
ポインタとinterfaceの値
Setできる値
reflectでinterfaceを満たしているかどうかの確認
動的なselect文の構築
5.4 reflectのパフォーマンスとまとめ
適材適所で利用するために
reflectと型アサーションの比較
reflectによるソート
まとめ
第6章 Goのテストに関するツールセット(鈴木健太)
テストの基礎と実践的なテクニック
6.1 Goにおけるテストのあり方
「明示」と「シンプル」
ソフトウェアにおけるテスト
Goにおけるテスト
6.2 testingパッケージ入門
テストの実行とテストコードの記述
テストの実行方法
Testable Examples
Unordered output
Examplesをgodocに載せる
6.3 ベンチマーク入門
文字列結合の例でまなぶ
ベンチマークの実行方法
サブベンチマークの利用
6.4 テストの実践的なテクニック
制御フロー、モック、テストカバレッジまで
Table Driven Tests
reflect.DeepEqualを使う
Race Detectorを使って競合状態を検出する
TestMainによるテストの制御
Build Consttaintsを利用したテストの切り替え
テストにおける変数または手続きの置き換え
インターフェースをつかったモック
net/http/httptestパッケージ
テストカバレッジ
Goにおけるテストのまとめ
第7章データベースの扱い方(mattn)
データベースを扱う実用的なアプリケーションを作ろう
7.1 Goにおけるデータベースの取り扱い
ドライバとの付き合い方
database/sqlの働き
7.2 database/sqlを使ってデータベースに接続する
postgresを使ってデータベースを開く
データベース接続の基本コード
アプリケーションのビルド
接続の確認
7.3 Exec命令の実行
テーブルを更新する
テーブルの作成
各データベースドライバの実装の違い
7.4 Query命令の実行
テーブルを読み込む
RowsとScan
単一行はQueryRowを使う
7.5 Goにおけるデータベースの型
Goとデータベースの型の違いを知る
database/sqlパッケージによる型変換
driver.Scannerの実装
不特定個数の値をScan
NULLをScanする
sql.NullString
7.6 ORMを使ったデータベースの扱い方
gorpを使ったテーブルの操作
ORM
gorpを使ったデータベース処理
7.7 RESTサーバを作る
GETでテーブルの値を返す
フレームワークecho
コメント一覧を作る
コメント登録処理を作る
画面を作る
おわりに
索引