みんなのGo言語 改訂2版


改訂2版 みんなのGo言語


技術評論社


著者:松木雅幸、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
  コメント一覧を作る
  コメント登録処理を作る
  画面を作る
  おわりに

索引

書籍目次

Posted by shi-n