imu-note
いむたろ
いむたろ
@imutaroh
新卒エンジニア / データ基盤 × AI

成り立ち

2007年、Google 社内で3人が始めた言語。

  • Ken Thompson:Unix と B 言語の作者
  • Rob Pike:Plan 9 の開発者。Thompson と UTF-8 を設計
  • Robert Griesemer:V8(JavaScript エンジン)や Java HotSpot VM に関わったエンジニア

きっかけは、Google の巨大な C++ コードベースへの不満。ビルドが遅い、言語が複雑、多数のエンジニアが同じコードを触ると読みにくい。そこに、マルチコア CPU とネットワーク越しのサーバーが当たり前になった時代の変化が重なる。「C のように速く、Python のように手軽に書けて、並行処理が得意な言語」を目指して設計された。

年できごと
2007Google 社内で設計開始
2009オープンソースとして公開
2012Go 1.0。「Go 1 の範囲で書いたコードは将来も動く」という互換性の約束
2015Go 1.5。コンパイラとランタイムが C から Go 自身で書き直される(セルフホスト)
2018Go 1.11。依存管理の Go Modules が登場(1.16 から既定)
2022Go 1.18。ジェネリクス(型パラメータ)が入る
2024Go 1.22。for ループの変数が1周ごとに別物になる(長年の落とし穴の解消)。1.23 で range over func(イテレーター)

リリースは年2回(2月と8月)。2026年10月時点の手元は Go 1.26.2。マスコットは Renée French がデザインしたホリネズミ(Gopher)。

特徴

  • 静的型付け+コンパイル言語:実行前に型が決まり、機械語の実行ファイルになる
  • 小さい言語仕様:キーワードは25個。クラスも継承も例外(try / catch)も無い
  • インターフェースは宣言不要:メソッドがそろっていれば、その型は自動でインターフェースを満たす(implements を書かない)
  • 継承の代わりに埋め込み(合成):構造体に別の構造体を埋め込んで機能を足す
  • エラーはただの値:失敗しうる関数は戻り値の最後に error を返し、呼んだ側が if err != nil で受ける
  • goroutine と channel:go f() だけで軽量スレッドが立つ。goroutine 同士は channel で値を受け渡す(CSP という並行処理の理論が下敷き)
  • ガベージコレクション:メモリ解放は自動
  • ツールが標準装備:gofmt(書式を1つに統一)・go test・go vet・go mod・race detector・pprof

使われている場所

  • クラウドの土台:Docker、Kubernetes、etcd、Terraform、Prometheus。コンテナとインフラの世界はほぼ Go 製
  • CLI ツール:GitHub CLI(gh)、Hugo(notes.imutaro.com のビルドに使っている静的サイトジェネレーター)
  • Web バックエンド・API サーバー:標準ライブラリの net/http だけで本番の HTTP サーバーが書ける
  • サーバーレス・コンテナ実行環境:Cloud Run など。起動が速く、イメージが小さく済む

強み

  • 単一バイナリで配れる:依存ライブラリごと1ファイルの実行ファイルになる。コンテナに入れても小さい
  • クロスコンパイルが簡単:GOOS=linux GOARCH=amd64 go build だけで Mac から Linux 用のバイナリが作れる
  • コンパイルが速い:大きなプロジェクトでもビルド待ちが短い。そもそもの設計動機
  • 並行処理を素直に書ける:goroutine は数千〜数万個立てても軽い。API を大量に叩く処理やサーバーと相性がいい
  • 誰が書いても似たコードになる:言語が小さく、gofmt で書式も統一される。チームで読みやすい
  • 後方互換性が強い:Go 1 の約束のおかげで、古いコードが新しいバージョンでもそのまま動く

関連