コンテンツにスキップ

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 が全プラットフォーム向けビルド + リリース作成を自動化できる
  • ghterraformkubectldocker など主要 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 ファイルアップロードを例にした推奨アーキテクチャ:

  1. Rails がジョブを Queue(Redis 等)に積む → すぐレスポンスを返す
  2. Go Worker が Queue からジョブを取り出し、goroutine で並行して S3 にアップロード
  3. 完了後に 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