初めてのGo言語 第2版

他言語プログラマーのためのイディオマティックGo実践ガイド

4,950円

内容

Go言語の全体像をバランスよく解説する定番入門書の改訂版。本書では、Go言語の基本機能を明快かつ簡潔に説明した後、イディオマティックなGoコードの書き方やGoプロジェクトの設計方法を解説します。第2版では、ジェネリックスの説明が大幅に改訂され、開発中のさまざまな場面で役に立つ各種ツールについて解説する章が追加されたほか、各章の最後に内容確認のための練習問題も用意されました。初版と同様、シンプルな例題を多用して基礎から明快かつ丁寧に解説しているので、読者はGo言語の基本をしっかりと身につけ、さまざまな場面で応用するための土台を築けます。

関連書籍

目次

賞賛の声(第2版)
賞賛の声(初版)
訳者まえがき
まえがき

1章 Go環境のセットアップ
    1.1 開発ツールのインストール
        1.1.1 インストール時に問題が起こったら
        1.1.2 Goのツール
    1.2 最初のGoプログラム
        1.2.1 モジュールの作成
        1.2.2 go build
        1.2.3 go fmt
        1.2.4 go vet
    1.3 ツールの選択
        1.3.1 Visual Studio Code
        1.3.2 GoLand
        1.3.3 Go Playground
    1.4 Makefile
    1.5 開発環境やバイナリファイルの更新
    1.6 実行ファイルの互換性
    1.7 練習問題
    1.8 まとめ

2章 事前宣言された型
    2.1 あらかじめ宣言された型
        2.1.1 ゼロ値
        2.1.2 リテラル
        2.1.3 bool(論理型)
        2.1.4 数値を表す型(数値型)
        2.1.5 文字を表す型
        2.1.6 明示的型変換
        2.1.7 リテラルと型
    2.2 変数の宣言
    2.3 定数
    2.4 型付きの定数と型のない定数
    2.5 未使用変数
    2.6 変数および定数の名前
    2.7 練習問題
    2.8 まとめ

3章 合成型
    3.1 配列
    3.2 スライス
        3.2.1 len
        3.2.2 append
        3.2.3 スライスのキャパシティ
        3.2.4 make
        3.2.5 スライスのクリア
        3.2.6 スライスの生成方法の選択
        3.2.7 スライスのスライス
        3.2.8 copy
        3.2.9 配列からスライスへの変換
        3.2.10 スライスから配列への変換
    3.3 文字列、rune、バイト
    3.4 マップ
        3.4.1 マップの読み書き
        3.4.2 カンマokイディオム
        3.4.3 マップからの削除
        3.4.4 マップのクリア
        3.4.5 マップの比較
        3.4.6 集合を、マップを使って表現
    3.5 構造体
        3.5.1 無名構造体
        3.5.2 構造体の比較と変換
    3.6 練習問題
    3.7 まとめ

4章 ブロック、シャドーイング、制御構造
    4.1 ブロック
        4.1.1 変数のシャドーイング
    4.2 if
    4.3 for
        4.3.1 for文
        4.3.2 条件のみのfor文
        4.3.3 無限ループ
        4.3.4 breakとcontinue
        4.3.5 for-rangeループ
        4.3.6 ラベル
        4.3.7 for文の選択
    4.4 switch
        4.4.1 switch文の基本
        4.4.2 ブランクswitch
        4.4.3 switch内のbreak
    4.5 ifかswitchか
    4.6 goto
    4.7 練習問題
    4.8 まとめ

5章 関数
    5.1 関数の宣言と呼び出し
        5.1.1 名前付き引数とオプション引数
        5.1.2 可変長引数とスライス
        5.1.3 複数の戻り値
        5.1.4 Pythonとの違い
        5.1.5 戻り値の無視
        5.1.6 名前付き戻り値
        5.1.7 ブランクreturn
    5.2 関数は値
        5.2.1 関数型の宣言
        5.2.2 無名関数
    5.3 クロージャ
        5.3.1 関数引数
        5.3.2 関数から関数を返す
    5.4 defer
    5.5 Goは値渡し
    5.6 練習問題
    5.7 まとめ

6章 ポインタ
    6.1 ポインタ入門
    6.2 ポインタを恐れる必要はない
    6.3 ポインタはミュータブル(変更可能)の印
    6.4 ポインタは最後の手段
    6.5 ポインタ渡しのパフォーマンス
    6.6 「ゼロ値」と「値なし」
    6.7 マップとスライスの違い
    6.8 バッファとして使うスライス
    6.9 ガベージコレクタの負荷軽減策
    6.10 ガベージコレクタのチューニング
    6.11 練習問題
    6.12 まとめ

7章 型、メソッド、インタフェース
    7.1 Goの型
        7.1.1 抽象型と具象型
        7.1.2 基底型
        7.1.3 Goの型の定義
    7.2 メソッド
        7.2.1 ポインタ型レシーバーと値型レシーバー
        7.2.2 nilインスタンスへの対応
        7.2.3 メソッドも関数
        7.2.4 関数とメソッドの使い分け
        7.2.5 型宣言と継承の違い
        7.2.6 型は実行可能なドキュメント
        7.2.7 iotaと列挙型
    7.3 埋め込みによる合成
    7.4 埋め込みと継承の違い
    7.5 インタフェース
        7.5.1 インタフェースは型安全なダックタイピング
    7.6 埋め込みとインタフェース
    7.7 インタフェースを受け取り、構造体を返す
    7.8 インタフェースとnil
    7.9 インタフェースは比較可能
    7.10 くう空インタフェース
    7.11 型アサーションと型switch
        7.11.1 型アサーション
        7.11.2 型switch
    7.12 型アサーションと型switchの利用は控えめに
    7.13 関数型とインタフェース
    7.14 暗黙のインタフェースによる依存性注入
    7.15 Goはさほどオブジェクト指向ではない(そしてそれは素晴らしいこと)
    7.16 練習問題
    7.17 まとめ

8章 ジェネリクス
    8.1 ジェネリクスのメリット――重複の削減と型安全性の向上
        8.1.1 型パラメータの必要性
        8.1.2 インタフェースを使った重複の回避とその問題点
    8.2 ジェネリクスの導入
    8.3 ジェネリック関数によるアルゴリズムの抽象化
    8.4 ジェネリクスとインタフェース
    8.5 型タームを使った演算子の指定
        8.5.1 型推論とジェネリクス
        8.5.2 型要素による定数の制約
        8.5.3 ジェネリック関数とジェネリックなデータ構造の利用
    8.6 comparableについての補足
    8.7 今後追加される可能性のある機能
    8.8 イディオム的Goとジェネリクス
    8.9 標準ライブラリへのジェネリクスの追加
    8.10 Go言語の今後とジェネリクス
    8.11 練習問題
    8.12 まとめ

9章 エラー処理
    9.1 エラー処理の基本
    9.2 単純なエラーの際の文字列の利用
    9.3 センチネルエラー
    9.4 エラーと値
    9.5 エラーのラップ
    9.6 複数エラーのラップ
    9.7 IsとAs
    9.8 deferを使ったエラーのラップ
    9.9 パニックとリカバー
    9.10 エラー時のスタックトレースの取得
    9.11 練習問題
    9.12 まとめ

10章 モジュールとパッケージ
    10.1 リポジトリ、モジュール、パッケージ
    10.2 モジュールとgo.modファイル
        10.2.1 goディレクティブを使ったビルドバージョンの管理
        10.2.2 requireディレクティブ
    10.3 パッケージの構成
        10.3.1 エクスポートする識別子の指定
        10.3.2 パッケージの作成とアクセス
        10.3.3 パッケージの命名法
        10.3.4 パッケージ名の変更
        10.3.5 Go Doc
        10.3.6 internalパッケージの利用
        10.3.7 循環参照
        10.3.8 モジュールの構成方法
        10.3.9 APIの名称変更や再構成
        10.3.10 init関数
    10.4 モジュール関連の操作
        10.4.1 サードパーティーのコードのインポート
        10.4.2 モジュールのバージョン
        10.4.3 ミニマルバージョン選択
        10.4.4 互換性をもつバージョンへのアップデート
        10.4.5 非互換のバージョンへのアップデート
        10.4.6 ベンダリング
        10.4.7 pkg.go.devサイト
    10.5 モジュールの公開
    10.6 モジュールのバージョンの決定
        10.6.1 依存性の上書き
        10.6.2 モジュールのバージョンの撤回
        10.6.3 ワークスペースを利用した複数のモジュールの更新
    10.7 モジュールプロキシサーバー
        10.7.1 プロキシサーバーの指定
        10.7.2 プライベートなリポジトリ
    10.8 練習問題
    10.9 まとめ

11章 各種ツール
    11.1 go run――短いプログラムの実行
    11.2 go install――サードパーティーツールのインストール
    11.3 goimports――インポートフォーマットの改善
    11.4 コード品質のチェック
        11.4.1 staticcheck
        11.4.2 revive
        11.4.3 golangci-lint
    11.5 govulncheck
    11.6 プログラムへのコンテンツの埋め込み
    11.7 隠しファイルの埋め込み
    11.8 go generate
        11.8.1 protobuf
        11.8.2 stringer
    11.9 go generateとMakefile
    11.10 Goバイナリ内のビルド情報の取得
    11.11 ほかのプラットフォーム用のGoバイナリのビルド
    11.12 ビルドタグ
    11.13 旧バージョンの処理系を使ったテスト
    11.14 go help
    11.15 練習問題
    11.16 まとめ

12章 並行処理
    12.1 並行性をいつ利用するべきか
    12.2 ゴルーチン
    12.3 チャネル
        12.3.1 読み込み、書き込み、バッファリング
        12.3.2 for-rangeとチャネル
        12.3.3 チャネルのクローズ
        12.3.4 チャネルの動作
    12.4 select
        12.4.1 selectとcase
        12.4.2 デッドロックの回避
        12.4.3 for-selectループ
    12.5 並行処理のベストプラクティスとパターン
        12.5.1 APIに並行性は含めない
        12.5.2 ゴルーチンとforループ
        12.5.3 ゴルーチンの終了チェック
        12.5.4 コンテキストを使ったゴルーチンの終了
        12.5.5 いつバッファ付きのチャネルを使うべきか
        12.5.6 バックプレッシャー
        12.5.7 selectにおけるcaseの無効化
        12.5.8 タイムアウト
        12.5.9 WaitGroupの利用
        12.5.10 コードを一度だけ実行
        12.5.11 並行処理ツールの協調
    12.6 チャネルの代わりにミューテックスを使うべきとき
    12.7 sync/atomic
    12.8 練習問題
    12.9 まとめ

13章 標準ライブラリ
    13.1 入出力
        13.1.1 パッケージio
        13.1.2 その他のパッケージの入出力関係の関数
    13.2 time
        13.2.1 時間
        13.2.2 時刻
        13.2.3 モノトニックタイム
        13.2.4 タイマーとタイムアウト
    13.3 encoding/json
        13.3.1 構造体タグを使ったメタデータの付加
        13.3.2 アンマーシャリングとマーシャリング
        13.3.3 JSONのリーダーとライター
        13.3.4 JSONストリーミングのエンコードとデコード
        13.3.5 JSON解析のカスタマイズ
    13.4 net/http
        13.4.1 HTTPクライアント
        13.4.2 HTTPサーバー
        13.4.3 ResponseController
    13.5 構造化ログ
    13.6 練習問題
    13.7 まとめ

14章 コンテキスト
    14.1 コンテキストとは
        14.1.1 コンテキストのファクトリ関数
        14.1.2 HTTPサーバーのコンテキストの特殊事情
    14.2 コンテキストによる値の伝播
    14.3 キャンセレーション
    14.4 デッドライン付きのコンテキスト
    14.5 独自コードにおけるキャンセレーションの処理
    14.6 練習問題
    14.7 まとめ

15章 テスト
    15.1 テストの基礎
        15.1.1 テスト失敗のレポート
        15.1.2 設定の適用と解除
        15.1.3 環境変数関連のテスト
        15.1.4 テスト用サンプルデータの保存
        15.1.5 テスト結果のキャッシング
        15.1.6 公開APIのテスト
        15.1.7 go-cmpによるテスト結果の比較
    15.2 テーブルテスト
    15.3 テストの並行実行
    15.4 コードカバレッジのチェック
    15.5 ファジング
        15.5.1 ファジング用のコードの記述
        15.5.2 ファズテストの実行(1回目)
        15.5.3 ファズテストの実行(2回目)
        15.5.4 ファズテストの実行(3回目)
    15.6 ベンチマーク
    15.7 スタブ
    15.8 httptest
    15.9 統合テストとビルドタグ
    15.10 並行実行に関する問題とデータ競合ディテクタ
    15.11 練習問題
    15.12 まとめ

16章 リフレクション、unsafe、cgo
    16.1 リフレクション
        16.1.1 型(type)、型情報(kind)、値(value)
        16.1.2 新しい値の生成
        16.1.3 インタフェースの値のnilチェック
        16.1.4 データのマーシャリングのためのリフレクション
        16.1.5 リフレクションで作った関数による繰り返し処理の自動化
        16.1.6 構造体とリフレクション
        16.1.7 リフレクションとメソッド
        16.1.8 リフレクションを利用するべきとき
    16.2 unsafe
        16.2.1 SizeofおよびOffsetof
        16.2.2 unsafeを使ったバイナリデータの変換
        16.2.3 エクスポートされていないフィールドへのアクセス
        16.2.4 unsafe関連ツール
    16.3 cgo
        16.3.1 グルーコード
        16.3.2 cgoの制約
    16.4 練習問題
    16.5 まとめ

付録A Go言語のまとめ
    A.1 ほかの言語で(あまり)見られない点
    A.2 型とゼロ値
        A.2.1 事前宣言された型(組み込み型)
        A.2.2 合成型(複合データ型、コンテナ型)、その他
    A.3 変数と定数の宣言
        A.3.1 事前宣言された型の変数の宣言
        A.3.2 配列とスライスの宣言
        A.3.3 スライスへの要素の追加
        A.3.4 サブスライス(スライスの要素の削除)
        A.3.5 マップの宣言とリテラル
        A.3.6 makeを使ったスライスやマップの生成
        A.3.7 定数の宣言
    A.4 構造体の宣言とリテラル
    A.5 型のエイリアス
    A.6 iota
    A.7 制御構造
        A.7.1 ifとforの基本形
        A.7.2 for-rangeの例
        A.7.3 switch
    A.8 演算子
    A.9 関数
    A.10 メソッド
    A.11 継承
    A.12 インタフェース
    A.13 ゴルーチン
        A.13.1 チャネルからの読み込みのパターン
    A.14 Goの「イディオム」
        A.14.1 イディオム的なもの
        A.14.2 「イディオム的」でない例
        A.14.3 その他、Goの「哲学」が感じられる選択
    A.15 備忘録

付録B 実例で学ぶGo言語入門
    B.1 予備知識
        B.1.1 Go言語のコードの留意点
    B.2 fmtパッケージのverb
        B.2.1 例題ディレクトリの構成
        B.2.2 プログラムの実行
        B.2.3 実行結果
    B.3 基本構文と標準入出力
        B.3.1 例外処理
        B.3.2 関数とループ
        B.3.3 switch
        B.3.4 日本語の識別子
    B.4 コマンドライン計算機――コマンドライン引数、文字列の置換と正規表現、外部コマンド
    B.5 ファイルの入出力
        B.5.1 ファイルを一度に読み込んで処理
        B.5.2 ファイルを1行ずつ処理
    B.6 ゴルーチン、チャネル、WaitGroup
        B.6.1 チャネルを使った単純な例
        B.6.2 ウェブサイトのチェック――WaitGroup版
        B.6.3 ウェブサイトのチェック――チャネル版
    B.7 まとめ

索引

コラム目次
    セミコロン挿入規則
    未使用の定数
    Goのランタイム
    UTF-8
    ハッシュマップ
    ユニバースブロック
    センチネルエラーのための定数の利用
    セマンティックバージョニング
    golang.org/xとerrgroup.Group
    sync.Map
    Goコードのプロファイリング
    モックとスタブ
    フラグ-short

関連ファイル