AI Session Notes - 2026-03-30
Go の特徴の全体像(並行処理・Docker 以外)
学んだこと
- Go はシングルバイナリにコンパイルされるため、依存ライブラリを含めて1つの実行ファイルで配布できる
GOOS/GOARCH環境変数を指定するだけで、別 OS・アーキテクチャ向けのクロスコンパイルが可能- インターフェースは暗黙的実装(Structural Typing)。
implementsキーワードなしで、メソッドを満たせば自動的に実装したことになる - エラーハンドリングは例外(try/catch)ではなく、戻り値で
errorを返す明示的なスタイル go fmt(フォーマット)、go test(テスト)、go mod(依存管理)が標準ツールとして統一されている
CLI ツールの配布方法と Go の強み
学んだこと
- CLI ツールの一般的な配布方法は大きく5つ: パッケージマネージャ(Homebrew, apt 等)、バイナリ直接配布(GitHub Releases)、ソースビルド、Docker イメージ、インストールスクリプト
- Python / Node.js 製の CLI はユーザー側にランタイムと依存ライブラリのインストールが必要で、バージョン不一致の問題が起きやすい
- Go 製の CLI はランタイムもライブラリも全部バイナリに含まれるため、ユーザーは Go のインストールすら不要
- GoReleaser を使うと
git tagを打つだけで GitHub Actions が全プラットフォーム向けビルド + リリース作成を自動化できる gh、terraform、kubectl、dockerなど主要 CLI ツールの多くが Go 製なのは、この配布の手軽さが大きな理由
Go の苦手な領域
学んだこと
- GUI アプリケーション: デスクトップアプリのエコシステムが弱い(Electron / Swift / C# の領域)
- データサイエンス・機械学習: Python の NumPy / pandas / PyTorch に相当するものがない
- 細かいメモリ制御: GC があるため、OS カーネルやゲームエンジンなどの低レイテンシ要件には C/C++/Rust が適する
- コードの冗長さ:
if err != nilの繰り返しなど、Python や Ruby の簡潔さに比べると冗長。ただしこれは「読みやすさ > 書きやすさ」という意図的なトレードオフ - 小さなスクリプト:
package宣言・main関数・エラー処理の準備が多く、書き捨てコードにはシェルや Python の方が速い - Go の立ち位置は「Python で書くには大きすぎるが、C++ で書くほどでもない」領域
Go と Ruby on Rails の立ち位置の違い
学んだこと
- Go と Rails は競合ではなく補完関係
- Rails は「画面付きの Web アプリを素早く作る」ことに特化(scaffold, ActiveRecord, Devise 等の成熟したエコシステム)
- Go は「大量のリクエストを高速にさばく」「配布するツールを作る」ことに強い
- 設計思想の違い: Ruby は「開発者の幸福・表現力」、Go は「シンプルさ・実行速度」を重視
- Rails は暗黙の規約(CoC)とメタプログラミング、Go は全てを明示的に書くスタイル
- Shopify や GitHub のような Rails 大規模ユーザーも、パフォーマンスが必要な部分に Go を使っている
Go + Rails 構成でのアーキテクチャパターン
学んだこと
- Go から Rails が作った DB に直接アクセスすることは技術的に問題ない(DB は独立したサーバー)
- ただし Go が DB に直接書き込むと、Rails の ActiveRecord コールバック(before_save, after_create 等)やバリデーションがバイパスされる
- 全てを Rails API 経由にすると Rails がボトルネックになり、Go の並行処理のメリットが消える
- 正解は「重い I/O は Go が直接やり、Rails には結果だけ伝える」パターン
詳細
S3 ファイルアップロードを例にした推奨アーキテクチャ:
- Rails がジョブを Queue(Redis 等)に積む → すぐレスポンスを返す
- Go Worker が Queue からジョブを取り出し、goroutine で並行して S3 にアップロード
- 完了後に DB を更新 or Rails に通知
Go が DB に直接書いていい場合の判断基準: - 単純な INSERT / UPDATE(ステータス変更、ログ記録) - Rails 側のコールバックが不要 - DB の制約(NOT NULL, UNIQUE 等)だけで整合性が保てる
Rails API を経由すべき場合: - 通知メール送信など副作用がある - 複雑なバリデーションが必要 - 他のモデルとの整合性を Rails が管理している
メタ情報
- ツール: Claude Code
- 関連技術: Go, Ruby on Rails, S3, Redis, Docker, CLI