関連サイト
本書の関連ページが用意されています。
内容紹介
保守やテストを容易にするGoの手法を学ぶ!
複雑な抽象化を捨て去り、単純で堅牢なGoプログラムを構築できる!
なじみのある他言語のクセから脱却
本書では、過度な抽象化を避け、保守やテストが容易になる慣用的(イディオム的)なGoコードの書き方を実践的に学ぶことができます。CLIツールやHTTPクライアント・サーバーの構築など、現実的なプロジェクトをサンプルとして取り上げます。
主な対象読者は、他言語を習得済みのプログラマーやGo言語への深い理解を求めるプログラマーですが、巻末の付録ではGo言語の基礎から並行処理までを解説しており、基本事項の速習&復習コースとして利用できます。
本書ではまず、Goの基本原則とイディオムを押さえつつ、実践的なテスト技法や最適化、CLIツールの構築方法を解説。続いて、依存性注入によるテスト容易性の向上、並行パイプラインを用いた同期APIの設計、HTTP処理の効率化へとステップアップします。終盤にかけては、パッケージとサービスの構成、ミドルウェアなどのコンポジションパターン、多態的なストレージ実装を明らかにしていきます。
本書は、基礎の確認から、段階的に高度な実践へと進むことで、単なる構文の習得にとどまらず、現場で真に役立つ「Goらしい」思考法と確かな設計力が自然と身につく一冊となっています。
※本書は、『Go by Example: Programmer's guide to idiomatic and testable code』(Manning Publications)の翻訳書です。
書誌情報
- 著者: Inanc Gumus(著), 柴田芳樹(訳)
- 発行日: 2026-09-09 (紙書籍版発行日: 2026-09-09)
- 最終更新日: 2026-09-09
- バージョン: 1.0.0
- ページ数: 464
- 対応フォーマット: PDF, EPUB
- 出版社: インプレス
対象読者
著者について
Inanc Gumus
数十年にわたるソフトウェアエンジニアリングの経験を持つプログラマーであり、情熱的な教育者でもある。幼少期からプログラミングを始めてC言語に習熟。大規模分散システムの設計やチームリーダーも経験しているが、2012年以降はGo言語を専門としており、SNSやGitHub、オンライン講座、ブログなどを通じて10万人以上の開発者を育成してきた。
柴田芳樹

九州工業大学情報工学科で情報工学を学び、1984年同大学大学院で情報工学修士課程を修了。パロアルト研究所を含む米国ゼロックス社での5年間のソフトウェア開発も含め、Unix(Solaris/Linux)、C、Mesa、C++、Java、Goなどを用いたさまざまなソフトウェア開発に従事してきた。2017年9月からは、Go言語によるウェブサービスのバックエンド開発に従事している。2024年4月からは個人事業主(フリーランス)として、引き続きバックエンド開発に従事している。2000年以降、私的な時間に技術書の翻訳や講演なども多く行っている。
目次
サンプルコード・正誤表・免責など
2つの道:複雑さと単純さ
献辞
推薦の言葉
まえがき
謝辞
本書について
著者紹介
第1章 Goの特徴と本書の目標
- 1.1 本書を読むべき理由
- 1.2 なぜGoなのか
- 1.3 Hello,gophers!
- 1.4 並行処理
- 1.5 型システム
- 1.6 標準ライブラリ
- 1.7 ツール群
- 1.8 次章に向けて
- 1.9 ソースコードとGoモジュール
第2章 イディオムとテスト
- 2.1 基礎
- 2.2 イディオム
- 2.3 テスト
- 2.4 テーブル駆動テスト
- 2.5 サブテスト
- 2.6 Exampleテスト
- 2.7 他のテスト用ツール
第3章 テストカバレッジと最適化
- 3.1 テストカバレッジ
- 3.2 ベンチマークと最適化
- 3.3 コンパイラ最適化
- 3.4 並列テスト
- 3.5 練習問題
第4章 コマンドラインインタフェース
- 4.1 基盤作り
- 4.2 フラグの解析
- 4.3 flagパッケージ
- 4.4 値パーサー
- 4.5 位置引数
- 4.6 検証
- 4.7 練習問題
第5章 依存性注入
- 5.1 テスト容易性に対する課題
- 5.2 テストしやすいプログラム
- 5.3 分離
- 5.4 CLIのテスト
- 5.5 単体テスト
第6章 並行処理のための同期API
- 6.1 概要
- 6.2 基盤
- 6.3 イテレータ
- 6.4 Options
- 6.5 統合
- 6.6 並行パイプラインパターン
- 6.7 プロデューサステージ
- 6.8 スロットラステージ
- 6.9 ディスパッチャステージ
- 6.10 練習問題
第7章 応答性と効率の高いプログラム
- 7.1 並行パイプラインの再訪
- 7.2 キャンセルの伝播
- 7.3 HTTPと効率的なI/O操作
- 7.4 最適化
- 7.5 テスト
- 7.6 HTTPテスト
- 7.7 練習問題
第8章 パッケージとサービスの構成
- 8.1 パッケージの構成
- 8.2 中核のロジック
- 8.3 HTTP
- 8.4 HTTPハンドラ
- 8.5 ルーティング
- 8.6 タイムアウト
- 8.7 テスト
- 8.8 シンプルさ
- 8.9 練習問題
第9章 コンポジションパターン
- 9.1 ミドルウェアパターン
- 9.2 レスポンスのログ記録
- 9.3 インターセプタパターン
- 9.4 オプショナル・インタフェース・パターン
- 9.5 コンテキスト値の伝播パターン
- 9.6 ハンドラ連鎖パターン
- 9.7 エンコードとデコード
- 9.8 包み込みと取り出し
- 9.9 振り返り
- 9.10 練習問題
第10章 ポリモーフィックなストレージ
- 10.1 SQLデータベースとのやり取り
- 10.2 データベースを基盤とするサービス
- 10.3 driver.Valuerインタフェースとsql.Scannerインタフェース
- 10.4 暗黙的なインタフェース
- 10.5 練習問題
付録A モジュールとパッケージ
- A.1 パッケージ
- A.1.1 例
- A.2 mainパッケージ
- A.3 モジュール
- A.4 ビルドと実行
- A.5 練習問題
付録B 変数とポインタ
- B.1 変数
- B.2 ポインタ
- B.2.1 ポインタとは何か
- B.2.2 nilポインタと型安全性
- B.2.3 アドレス演算子
- B.2.4 値渡しの仕組み
- B.2.5 スタックとヒープメモリ
- B.3 練習問題
付録C 配列、スライス、マップ
- C.1 配列
- C.1.1 配列操作
- C.1.2 配列の受け渡し
- C.1.3 ポインタの受け渡し
- C.1.4 練習問題
- C.2 スライス
- C.2.1 使い方
- C.2.2 基底配列
- C.2.3 スライスの受け渡し
- C.2.4 スライス式と容量
- C.2.5 要素の追加
- C.2.6 make()関数でスライスを作成
- C.2.7 文字列とバイトスライス
- C.2.8 エイリアスの影響
- C.2.9 スライスのコピー
- C.2.10 練習問題
- C.3 マップ
- C.3.1 練習問題
付録D オブジェクト指向プログラミング
- D.1 構造体
- D.1.1 新たな型の宣言
- D.1.2 新たな値の作成
- D.1.3 無名型
- D.1.4 名前付き型
- D.2 メソッドとレシーバ
- D.2.1 レシーバの型
- D.2.2 値レシーバ
- D.2.3 ポインタレシーバ
- D.2.4 レシーバ型混在の回避
- D.2.5 レシーバ型の選択
- D.2.6 練習問題
- D.3 暗黙的なインタフェース
- D.3.1 具象型からの開始
- D.3.2 インタフェースの発見
- D.3.3 つなぎ合わせ
- D.3.4 インタフェースの活用
- D.3.5 インタフェース値とメソッドの集まり
- D.3.6 練習問題
- D.4 ジェネリクス
付録E 並行処理プログラミング
- E.1 ゴルーチン
- E.1.1 逐次実行
- E.1.2 並行実行
- E.2 WaitGroupの活用
- E.2.1 syncx.SafeGroupの活用
- E.2.2 練習問題
- E.3 バッファなしチャネル
- E.3.1 使い方
- E.3.2 同期
- E.3.3 パターン:送信と受信
- E.4 チャネルのクローズ
- E.4.1 パターン:for-range
- E.4.2 パターン:クローズ通知による同期
- E.5 select文の活用
- E.5.1 複数チャネルの待機
- E.5.2 パターン:待機しない操作
- E.6 バッファありチャネル
- E.6.1 パターン:タイムアウト
- E.6.2 方向付きチャネル
- E.6.3 パターン:並行実行数の制限
- E.7 練習問題
付録F 自己参照オプション
- F.1 構造体オプション
- F.1.1 ゼロ値のあいまいさ
- F.1.2 ゼロ値オプション
- F.2 オプション関数
- F.2.1 SendNWith()関数
- F.2.2 関数としてのオプション
- F.2.3 オプションの適用
- F.2.4 まとめ
