Go
単一バイナリに固めて配布できる静的型付け言語。並行処理と配布が軽い
分野「言語・実行環境」:プログラムを書くための「言葉」と、それを動かす仕組み。 分野の役割とつながりは分野の解説へ。
別名:Golang、Go言語
できること
- コマンドラインツールを作る :ターミナルから使う道具を作りたい
- HTTP API を公開する :自分のデータや処理を他から呼ばせたい
- 常時起動のプロセスを保持する :WebSocket や常駐ワーカーを動かしたい
- 大量データを一括処理する :数万件以上を一気に処理したい
- HTTP API を呼び出す :外部サービスからデータを取りたい
Go ができないこと
- ブラウザ上の画面構築(WebAssembly 出力はあるが、DOM 操作は JavaScript 経由になる)
- 例外(try/catch)による大域的なエラー処理。エラーは戻り値で逐一扱う設計が前提
- GC を止めた完全な手動メモリ管理(リアルタイム制御や組み込みの一部では候補に入らない)
- 対話的な逐次実行(公式の REPL はなく、コンパイルして動かすのが前提)
- C ライブラリに依存するコードの追加設定なしのクロスコンパイル(cgo はクロス時に既定で無効)
制約
先頭の行が、このツールで最も先に当たる制約。値はすべて出典の一次情報で確認したもの。
| 項目 | 値 | 影響 | 出典 | 検証日 |
|---|---|---|---|---|
| 旧バージョンのサポート期間 (主要制約) | 各メジャー版は、その後2つ新しいメジャー版が出るまでサポート。メジャー版は2月と8月の半年ごと(実質約1年) | 1年放置すると修正が来ないバージョンになる。年1回はツールチェーンを上げる運用を前提にする | go.dev | |
| セキュリティ修正の対象 | 直近2つのメジャー版と開発版(master)のみ | 上と同じく、2世代前のバージョンには脆弱性修正が配布されない | go.dev | |
| 後方互換性の保証範囲(Go 1 互換性) | Go 1 で書いたソースはコンパイル・実行が維持される。ただしバイナリ互換は保証されず、unsafe の利用・キーなし構造体リテラル・ドットインポートは保証の対象外 | ツールチェーンを上げても書き直しはほぼ発生しないが、再コンパイルは必要。他パッケージの構造体はキー付きリテラルで書く | go.dev | |
| 実行ファイルのサイズ | 既定で静的リンク。fmt.Printf だけのプログラムでも数 MB(C の同等品は約 750 KB)。-ldflags=-w でデバッグ情報を除ける | 配布物が最初から MB 単位になる。多数のマイクロバイナリを配る場合はサイズを見込む | go.dev | |
| cgo とクロスコンパイル | クロスコンパイル時は cgo が既定で無効(CGO_ENABLED=0)。C 依存パッケージを含めるには C クロスコンパイラの指定が必要 | SQLite ドライバなど C 依存のライブラリを使うと、他 OS 向けビルドが1コマンドでは済まなくなる。純 Go 実装のライブラリを選ぶ | pkg.go.dev | |
| 動作環境の下限 | Linux はカーネル 3.2 以降(Go 1.24〜)、Windows 10 / Server 2016 以降(Go 1.21〜)、macOS 13 以降(Go 1.27〜) | 古い OS 向けに配るバイナリは、古いツールチェーンで別途ビルドする必要がある | go.dev |
典型的な落とし穴
- goroutine に終了条件を持たせないとリークする。context でキャンセルを伝播する設計を最初から入れる
- エラーを _ で捨てる、err の確認を書き忘れると失敗が黙って進む。go vet と errcheck 系の linter を CI に入れる
- nil マップへの書き込み、nil インターフェースと nil ポインタの区別など、nil 周りで実行時 panic になる
- GOPATH 時代の記事が多く残っている。現在は go.mod によるモジュール管理が前提で、古い手順は通らない
コスト
- 課金モデル
- 無料
- 跳ねる条件
BSD 3-Clause License で無償、商用利用も制限なし。費用は動かすサーバー側で発生する
- 出典
- go.dev 検証
代替手段と差分
| 代替 | 何が違うか |
|---|---|
| Python | Python は書く量が少なく、データ処理・AI のライブラリが厚い。Go は実行速度・並列処理・単一バイナリ配布で勝り、CLI や常駐サーバーに向く |
| TypeScript | TypeScript はブラウザと同じ言語でサーバーを書け、npm の資産を使える。Go は依存の少ない単一バイナリを吐き、Node.js のような実行環境の同梱が不要 |
このツールを代替として挙げているページ: FastAPI 、Python 、TypeScript 、Rust
選定判断
CLI ツール、HTTP API サーバー、常駐ワーカーなど「配布して長く動かす」用途では第一候補。ブラウザ画面、データ分析・機械学習、数十行で済む自動化スクリプトは避け、TypeScript か Python へ
Google 発の静的型付け言語で、コンパイルすると依存を含む単一の実行ファイルになる。goroutine とチャネルによる並行処理が言語機能として組み込まれ、Docker・Kubernetes・Terraform など運用系ツールの多くがこの言語で書かれている。
最初に当たる制約は言語仕様の限界よりも運用側にある。サポートは直近2メジャー(約1年)に限られるため、年1回のツールチェーン更新が前提になる。Go 1 互換性保証のおかげで更新そのものはほぼ書き直しなしで済む。コードを書く上では、例外がなくエラーを戻り値で毎回扱う点と、cgo に依存した瞬間にクロスコンパイルの手軽さが失われる点が分岐点になる。