本書は、中級以上のGoプログラマーがツール開発・プロダクト開発で必要とされるプログラミングテクニックおよび周辺知識を学ぶための実践集です。
Goはコマンドラインツール、Webサービス開発、ソフトウェアやクラウドサービスの拡張機能開発、IoTなど利用範囲の広いプログラミング言語です。これらの用途でGoを使うには、基本的な文法だけでなく、Goの特徴を活かした定石のコードの書き方、ライブラリの知識、テストなどの開発手法、Go以外の周辺知識などの理解も必要です。文法解説が主の入門書では、これらを学ぶことは難しいです。そこで本書では、現役のGoプログラマーが実務や趣味で開発したオープンソースソフトウェア(OSS)を紹介します。その開発の過程で書かれたコード、参照された資料、使われた開発手法を解説しつつ、より詳しく学ぶための参考資料を提示します。入門レベルを脱して、自ら応用力を身につけるための取っ掛かりとなる情報を提供します。
序章 プロダクト開発の前に習得しておきたい6機能
0.1 基本の型とインタフェース
0.1.1 Goにおける型
0.1.2 スライスの操作
0.1.3 マップの操作
0.1.4 構造体の設計
0.1.5 メソッドの呼び出し
0.1.6 インタフェースの基礎
0.1.7 インタフェースの設計
0.1.8 型情報を利用した処理
0.2 入出力
0.2.1 入出力とioパッケージ
0.2.2 io/fsパッケージ
0.3 ゴルーチンとチャネル
0.3.1 Goの並行処理における哲学
0.3.2 ゴルーチン
0.3.3 チャネル
0.3.4 チャネルパターン
0.3.5 シンプルに並行処理を記述する
0.3.6 並行性の問題を検出する
0.4 コンテキスト
0.4.1 コンテキストとは
0.4.2 なぜcontextパッケージが必要なのか
0.4.3 contextパッケージの基本
0.4.4 contextパッケージの使い方
0.5 ポインタ
0.5.1 Goにポインタはなぜ必要なのか
0.5.2 ポインタと実体の使い分け
0.5.3 unsafe.Pointerの世界
0.6 エラーハンドリング
0.6.1 エラーの基礎
0.6.2 エラーのラッピング
0.6.3 実践的なエラーハンドリング
0.6.4 まとめ
第1章 Goエキスパートたちの実装例1 CLIツール、ライブラリ
1.1 コードの複雑さを計測するコードチェックツール
1.1.1 Goのコードを静的解析する
1.1.2 コードの複雑さを計測する方法
1.1.3 GoでGoのソースコードを扱う
1.1.4 循環複雑度を調べる機能を作る
1.1.5 静的解析ツールを作成し実行する
1.1.6 まとめ
1.2 依存関係のある処理を並行して実行できるタスクランナー
1.2.1 タスクランナーを作成する
1.2.2 Goでコマンドラインツールを作る理由
1.2.3 タスクランナー「ran」
1.2.4 ranの実装
1.2.5 まとめ
1.3 インターネット回線のスピードテスト
1.3.1 スピードテストサービスを作る
1.3.2 スピードテストサービスのしくみ
1.3.3 アプリケーションの実装
1.3.4 CLIの実装
1.3.5 まとめ
1.4 インタラクティブなgRPCクライアント
1.4.1 gRPCクライアント「Evans」
1.4.2 gRPCとProtocol Buffers
1.4.3 CLIツール作成に役立つOSS
1.4.4 アプリケーションの実装
1.4.5 E2Eテスト
1.4.6 アプリケーションの配布
1.4.7 まとめ
1.5 複数のアルゴリズムに対応したチェックディジットライブラリ
1.5.1 身近なしくみを発見する
1.5.2 チェックディジットとは
1.5.3 利用する側に寄り添う
1.5.4 さまざまなチェックディジットの生成方法
1.5.5 Exampleテストを用いたドキュメンテーション
1.5.6 CLIを実装し利用するハードルを下げる
1.5.7 まとめ
1.6 Kubernetesなどの設定ファイルのテストツール
1.6.1 インフラの設定ファイルのテストツールを作る
1.6.2 HashiCorp SentinelとPolicy as Code
1.6.3 steinの紹介
1.6.4 steinの実装
1.6.5 まとめ
1.7 Cloud Spanner用データベーススキーマ管理ツール
1.7.1 Cloud Spannerの利点と難点
1.7.2 DBスキーマ管理ツール「Wrench」
1.7.3 Bazelを用いたビルド
1.7.4 まとめ
1.8 ビットコインメッセージの変換関数の生成
1.8.1 コードの自動生成
1.8.2 ビットコイン(Bitcoin)とは
1.8.3 Bitcoinのプロトコルの特徴
1.8.4 実装
1.8.5 まとめ
1.9 条件を柔軟に変えられるリトライライブラリ
1.9.1 リトライの意義
1.9.2 リトライとは
1.9.3 うまくリトライするためのポイントと実装
1.9.4 まとめ
第2章 Goエキスパートたちの実装例2 API連携、他機能連携
2.1 Nature Remoによる家電の操作
2.1.1 Nature Remoを使って家電を操作する
2.1.2 コマンドラインツールから家電を操作する
2.1.3 LINEでエアコンを予約する
2.1.4 まとめ
2.2 Raspberry PiによるCO2、温湿度、気圧のモニタリング
2.2.1 センサーを使ったIoTデバイスを作成する
2.2.2 センサーからデータを読み取る
2.2.3 サーバとWorkerの作成
2.2.4 まとめ
2.3 KubernetesのJob実行ツール
2.3.1 Kubernetesを用いた開発の現状と課題
2.3.2 GoアプリケーションのJob実行ツール「jctl」
2.3.3 Kubernetesのクライアント
2.3.4 GitHub Actionsとkindを利用したE2Eテスト
2.3.5 まとめ
第3章 Goエキスパートたちの実装例3 ソフトウェアやWebサービスの拡張機能
3.1 Goによるプラグイン機能の実装
3.1.1 プラグインとは
3.1.2 Goでプラグイン機能を実装する方法
3.1.3 動的ライブラリとしてプラグインを作成する
3.1.4 別のバイナリとしてプラグインを作成してRPC経由で利用する
3.1.5 pluginパッケージを利用したscenarigoの実装
3.1.6 まとめ
3.2 GitHub Actionsによる自動化
3.2.1 GitHub Actionsとは
3.2.2 GitHub Actionsの使い方
3.2.3 GitHub Actionsの作り方
3.2.4 Actionの実装
3.2.5 ユニットテスト
3.2.6 Dockerfileの作成
3.2.7 インテグレーションテスト
3.2.8 Actionの公開
3.2.9 まとめ
3.3 Kubernetes Custom Controllerで作るCloud Spannerオートスケーラ
3.3.1 Cloud Spannerオートスケーラ開発の経緯
3.3.2 Kubernetes Custom Controller
3.3.3 spanner-autoscaler
3.3.4 まとめ
3.4 Envoy Control Plane Kubernetes Controller
3.4.1 クラスタ上のEnvoyを管理するためのxDS APIサーバ
3.4.2 Goを用いたControl Planeの実装
3.4.3 Kubernetes Custom Controllerのための開発環境
3.4.4 まとめ
3.5 Custom Terraform Providerによるプロビジョニングの自動化
3.5.1 Terraformで公式対応されていないリソースを管理するには
3.5.2 Terraform Providerとは
3.5.3 Custom Terraform Providerの作り方
3.5.4 Terraform Registryに公開
3.5.5 まとめ
第4章 Goエキスパートたちの実装例4 Goの活用の幅を広げる技術
4.1 高度なテキスト変換
4.1.1 簡単なテキスト変換
4.1.2 文字コードや半角・全角の変換
4.1.3 Unicodeとコードポイントごとの変換
4.1.4 transform.Transformerインタフェースの実装
4.1.5 まとめ
4.2 WebAssemblyを使ってブラウザ上でGoを動かす
4.2.1 Goの世界を大きく広げるWebAssembly
4.2.2 WebAssemblyとは
4.2.3 Goのコードをブラウザ上で動かす
4.2.4 syscall/jsを使う
4.2.5 GoのパッケージをJavaScriptから使えるようにする
4.2.6 まとめ
4.3 cgoでGoからC言語のライブラリを使う
4.3.1 Goの可能性を広げるcgo
4.3.2 FFIとcgo
4.3.3 cgoの使い方
4.3.4 GoからCの関数を呼び出す方法
4.3.5 CからGoの関数を呼び出す方法
4.3.6 構造体のバインディング
4.3.7 cgoを使って開発したライブラリ例
4.3.8 まとめ
第5章 Goエキスパートたちの実装例5 実験・検証
5.1 Mutual-TLS Certificate-Bound Access Tokens
5.1.1 アクセストークンとは
5.1.2 JWT、Mutual TLS、OAuth
5.1.3 Mutual TLS Certificate-Bound Access Tokens
5.1.4 Goにおける実装
5.1.5 まとめ
5.2 簡易な空間検索
5.2.1 はじめに
5.2.2 ナイーブなアプローチ
5.2.3 4分木
5.2.4 木の特徴
5.2.5 点に経路を割り当てる
5.2.6 検索に用いる
5.2.7 より多次元への拡張
5.2.8 まとめ