目次
序章 プロダクト開発の前に習得しておきたい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 まとめ