目次
第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
Buildとデプロイ
モニタリング
まとめ
第2章 マルチプラットフォームで動作売る社内ツールのつくり方 Windows、Mac、Linux、どの環境でも同じように動作するコードを書こう
2.1 Goで社内ツールをつくる理由
みんな違っていて当然
さまざまな環境への対応がせまられる
Goを採用する利点
2.2 守るべき暗黙のルール
OS間の移植をあらかじめ想定する
積極的にpath/filepathを使う
積極的にdeferを使う
積極的にUTF-8を使う
2.3 TUIもWindowsで動かしたい
termboxとgo-colorble
簡単にTUIアプリケーションのが作れるtermbox
go-colorableの使い方
2.4 OS固有の処理への対応
runtime.GOOSとBuilds Constraints
runtime.GOOSを使う
Builds 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
表記変換とパーサ
3.6 Goから外部コマンドを実行する
os/execパッケージの活用
外部コマンドを実行する利点
os/execパッケージ
os/execパッケージの使用例
外部コマンドをシェル経由で起動する(UNIX系の環境のみ)
go-shellwordsでコマンドライン文字列を解釈する
3.7 タイムアウトする
パッケージの機能とcontextの利用
使用するパッケージにタイムアウト機能が用意されている場合
contextパッケージの利用
3.8 goroutineの停止
平行処理、非同期実行のハンドリング
goroutineを外部から停止する
3.9 シグナルを扱う
適切にハンドリングするために
Goでシグナルを扱う
独自のシグナルを定義する
第4章 コマンドラインツールを作る 実用的かつ保守しやすいコマンドラインツールを作ろう
なぜ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パッケージを使って得られる情報
relfect.Value
型により動作を変える
relfect.Type
structをパースする
5.3 relfectの利用例
ハマらないためのレシピ集
値を動的に生成する
見える範囲・見えない範囲
ポインタと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 Constraintsを利用したテストの切り替え
テストにおける変数または手続きの置き換え
インターフェースをつかったモック
net/http/httptestパッケージ
テストカバレッジ
Goにおけるテストのまとめ
第7章 データベースの扱い方 データベースを扱う実用的なアプリケーションを作ろう
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.Scannnerの実装
不特定個数の値をScan
NULLをScanする
sql.NullString
7.6 ORMを使ったデータベースの扱い方
gorpを使ったテーブルの操作
ORM
gorpを使ったデータベースの処理
7.7 RESTサーバを作る
GETでテーブルの値を返す
フレームワークecho
コメント一覧を作る
コメント登録処理を作る
画面を作る