エンジニア選書シリーズGo言語プログラミングエッセンス

書籍の概要

この本の概要

Go言語ユーザーとして,「もう一段レベルアップしたい」「開発に使いたい」と思っている方に向けた,Go言語の解説本です。関数やパッケージの使い方,並行処理,テストといった基本的なトピックにおいて,「こう書くと綺麗になる」「こう書くとパフォーマンスが上がる」といったエッセンスを紹介します。後半ではCLIアプリ/Webアプリの開発手順や,現場で使われている便利なパッケージなど,著者が業務やOSSの開発で培った技術をふんだんに紹介します。

こんな方におすすめ

  • Go言語の入門を終え,さらに深く学びたい人

この書籍に関連する記事があります!

プログラマーに愛されるGo言語
Go言語ユーザーとして、「もう一段レベルアップしたい」「開発に使いたい」と思っている方に向けた、Go言語の解説本です。

本書のサンプル

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

サンプル画像3

目次

第1章 プログラミング言語Goとは

  • 1.1 Goの簡単な歴史
  • 1.2 Goの立ち位置
  • 1.3 Goが利用される場面
    • 標準でUTF-8をサポート
    • マルチプラットフォーム
    • 並行処理の扱いやすさ
    • ストリーム指向
    • シングルバイナリ
  • 1.4 教育用途としてのGo
  • 1.5 なぜGoが使われるのか
    • コンパイルの速さ
    • レビューのしやすさ
    • 周辺ツールの充実
    • パッケージ公開の簡単さ
    • libc非依存
    • 共同開発でのスキル差
  • 1.6 まとめ

第2章 開発環境の準備

  • 2.1 Goコンパイラのインストール
    • [COLUMN]GOROOT? GOPATH?
  • 2.2 開発環境のセットアップ
    • Visual Studio Code
    • Vim
    • Goland
  • 2.3 まとめ

第3章 基本的な文法

  • 3.1 プロジェクトフォルダ
  • 3.2 Go言語の特徴
  • 3.3 静的な型
  • 3.4 基本的な構文
    • 変数宣言
    • const(定数宣言)
    • iota(列挙)
    • 命名規則
    • 関数呼び出し
    • 条件分岐
    • ループ
    • 配列とスライス
    • 文字列
    • map
    • type(型宣言)
    • struct(構造体)
    • メソッド
    • ポインタ
    • interface{}またはany
    • コンストラクタ
    • インターフェース
    • defer
  • 3.5 goroutine(ゴルーチン)
    • channel(チャネル)
    • 制御構文(select)
  • 3.6 Goモジュールとは
    • go.modの配置
    • replace
    • go install
  • 3.7 プロジェクトレイアウト
  • 3.8 lint文化
    • go vet
    • revive
    • golangci-lint
  • 3.9 go fmt
  • 3.10 まとめ
    • [COLUMN]おまじない

第4章 基本テクニックとベストプラクティス

  • 4.1 ビルトイン関数
    • printとprintln
    • panicとrecover
    • [COLUMN]Explicit is better than implicit, Simple is better than complex
    • init関数
  • 4.2 パッケージ
    • fmtパッケージ
    • logパッケージ
    • encoding/jsonパッケージ
    • netパッケージ
    • timeパッケージ
    • pathパッケージとpath/filepathパッケージ
    • osパッケージ
    • ioパッケージ
    • contextパッケージ
  • 4.3 build constraints
    • ファイル名による指定
    • +build(またはgo:build)コメントによる指定
    • [COLUMN]マルチプラットフォーム向けアプリケーションの開発テクニック
  • 4.4 cgo
    • pkg-configを使って複雑なコンパイルオプションに対処
  • 4.5 go:embed
  • 4.6 Functional Options Pattern
  • 4.7 Builder Pattern
  • 4.8 internalパッケージ
  • 4.9 Embedded struct
  • 4.10 go run
  • 4.11 まとめ

第5章 Webアプリケーションの開発に必要な要素

  • 5.1 net/http
    • 基本の使い方
    • ルーティング
    • [COLUMN]Method Value
    • ファイルのサーブ
  • 5.2 html/template
    • struct
    • range/end
    • if/else/end
    • with/else/end
    • template.HTML
    • FuncMap
    • template.Parse
    • define/template
  • 5.3 net/smtp
  • 5.4 まとめ

第6章 速いプログラムのためのテクニック

  • 6.1 並行と並列
  • 6.2 goroutine
  • 6.3 channel
  • 6.4 非同期パターン
    • ジェネレータ
    • 合流処理
    • 先着処理
    • タイムアウト処理
    • 停止処理
    • スロットリング(throttling)
  • 6.5 まとめ

第7章 テストにおけるテクニック

  • 7.1 テストの考え方
  • 7.2 Goのテストの基本
    • Table Driven Tests
    • t.Skip/t.Skipf
    • setup/teardown
    • t.Short
    • t.Parallel
    • テストデータ
    • カバレッジ
  • 7.3 便利なテクニック
    • テンポラリディレクトリ
    • 環境変数
  • 7.4 Fuzzingテスト
  • 7.5 まとめ

第8章 ベンチマークにおけるテクニック

  • 8.1 「推測するな、計測せよ」
  • 8.2 ベンチマークの基本
  • 8.3 ベンチマークの比較
    • 改善の前と後の比較
    • 異なる実装の比較
  • 8.4 プロファイリング
  • 8.5 まとめ

第9章 GoによるCLIアプリケーション開発

  • 9.1 システムのコンセプト
  • 9.2 データベース登録プログラム
    • [COLUMN]プログラムを作る手順
    • ZIPファイルのURL一覧を得る
    • ZIPファイルを展開する
    • データベースに登録する
  • 9.3 データベース照会プログラム
  • 9.4 テストの実装
  • 9.5 CLI開発に役立つライブラリ
  • 9.6 フラグライブラリ
    • flagパッケージ
    • urfave/cli
    • alecthomas/kingpin
    • spf13/cobra
  • 9.7 端末制御ライブラリ
    • olekukonko/tablewriter
    • mattn/go-runewidth
    • jroimartin/gocui
  • 9.8 まとめ

第10章 GoによるWebアプリケーション開発

  • 10.1 システムのコンセプト
  • 10.2 TODOアプリケーション
    • Webサーバ
    • リクエストハンドラ
    • テンプレート処理
    • 静的ファイルのサーブ
  • 10.3 リマインダメール送信
  • 10.4 Goにおけるフレームワーク
    • Gin
    • Echo
    • Micro
    • Beego
    • フレームワークの選定について
  • 10.5 まとめ

第11章 GitHubでの開発における勘所

  • 11.1 ライブラリの仕様
  • 11.2 プロジェクトの作成
  • 11.3 パッケージ名
  • 11.4 実装
  • 11.5 バージョニング
    • [COLUMN]GitHubのワンポイントTips
  • 11.6 テスト
  • 11.7 ドキュメント
    • go docの使い方
    • godocの使い方
    • https://pkg.go.dev/で閲覧する
  • 11.8 ディレクトリ構造
  • 11.9 自動テスト
  • 11.10 自動リリース
  • 11.11 まとめ

第12章 データベースの扱い方

  • 12.1 database/sql
    • サードパーティドライバ
    • Query/QueryRow
    • Exec
    • Prepare
    • Begin/Commit/Rollback
  • 12.2 ent/ent
    • OpenAPI連携
    • entgen
  • 12.3 ORMベンチマーク
  • 12.4 まとめ

第13章 Goとクラウドサービス

  • 13.1 Goがなぜ使われるのか
  • 13.2 Google Cloud
  • 13.3 AWS Lambda
  • 13.4 Oracle Cloud
    • [COLUMN]バイナリサイズを小さくする
  • 13.5 まとめ

著者プロフィール

mattn(まっつん)

さまざまなOSSにコントリビュートを行うITエンジニア。月刊誌「Software Design」にて連載記事「Vimの細道」のほか,Vim,Go言語に関する記事を多数執筆。共著に『みんなのGo』。Google Developers Expert(Go)。

Twitter:@mattn_jp
GitHub:https://github.com/mattn
Blog:https://mattn.kaoriya.net/