# Go

分類：言語
公式：https://go.dev/

言語別の既定：§2-2（/s/2.md）

## 選ぶ場面（§2-10）
- Kubernetes・クラウドのコントロールプレーンを扱う
- 中程度の常時接続＋高スループット：goroutineで並行処理が簡潔に書け、運用も単純
- サービス間のRPC：Protocol Buffers周りのツールが充実し、単一バイナリで配りやすい

## 既定として使う役割
- CLIツール（§2-9）：Go
  - 代替 Rust：起動時間・バイナリサイズ・処理速度を詰めたい
  - 代替 TypeScript（Bun）：社内向けでnpmの資産を使いたい
- インフラ系ツール（Kubernetes Operator、Terraformプロバイダ等）（§2-9）：Go（公式SDKがGo中心）

## 代替として使う条件
- 一般的なWeb API・SaaSのバックエンド（§2-9、既定はTypeScript（フロントと1言語に揃う））：3人以上で公開APIを長期運用するとき（§2-10 手順3）
- 開発者向けツール（Linter、フォーマッタ、ビルドツール、パーサ）（§2-9、既定はRust）：処理が軽く、開発速度を優先したいとき
- データベース・検索エンジン等の基盤ソフト（§2-9、既定はRust）：GCの影響が許容できる分散系の制御部分
- スクリプト・社内の小さな自動化（§2-9、既定はTypeScript（Node.jsで直接実行、またはBun））：単一バイナリで配りたいとき

## 採用の根拠（§22-2）
単一バイナリで配布でき、実行時の依存がない。メモリ使用量が小さく、同時接続に強い。Go 1互換性の約束により、長期間コードが壊れにくい。Docker、Kubernetes、TerraformなどインフラOSSの多くがGoで書かれている
懸念と回答：「人材が少ないのでは」→ 言語仕様が小さく、他言語経験者なら短期間で読み書きできる

## ケース別の構成（§19）
- 自社SaaS（B2B）：バックエンド＝Go（net/http＋sqlc＋pgx）。少人数ならHono
- toCサービス（Web＋モバイル）：バックエンド＝Hono（またはGo）
- リアルタイム系（チャット・通知・共同編集）：同時接続が多い（Elixirを採用しない場合）＝Go（WebSocket）＋Valkey Pub/Sub
- インフラツール・CLI：言語＝Go（Cobra、slog）
- 個人開発・MVP：Go単体＝Go＋PostgreSQL＋htmx
