| この記事の要点 |
|
概要
Go(通称 Golang)は、Google の Robert Griesemer・Rob Pike・Ken Thompson らが 2007 年に設計を開始し、2009 年 11 月にオープンソースとして公開された静的型付けコンパイル言語です。「C 言語ほど煩雑でなく、Python ほど遅くなく、Java ほど冗長でない」という現実的なバランスを狙って設計されました。ソースコードの拡張子は .go、コンパイル後はターゲット OS / アーキテクチャに応じた 単一の実行バイナリ が生成されます。
Go の最大の特徴は 並行処理(concurrency)モデル の優秀さです。go キーワードを関数呼び出しの前に置くだけで「goroutine」と呼ばれる軽量スレッドが起動し、channel によってスレッド間で安全に値を受け渡せます。これは Tony Hoare の CSP(Communicating Sequential Processes)理論を実装に落とし込んだものです。さらに ガベージコレクション(GC)を搭載しているため、C / C++ のような手動メモリ管理は不要です。
1.18(2022 年)でジェネリクスが導入され、func Map[T, U any](s []T, f func(T) U) []U のような型パラメータが書けるようになりました。1.21 で min / max / clear の組み込み、1.22 でループ変数のスコープ修正など、後方互換性を慎重に保ちつつ進化を続けています。
用途は CLI ツール・Web API サーバー・マイクロサービス・クラウドネイティブインフラ が中心。Docker・Kubernetes・Terraform・Prometheus・etcd・CockroachDB など、現代のインフラを支えるツールの多くが Go で書かれています。コンパイル速度が極めて速く、CI / CD と相性が良い点も普及の理由です。
ファイル種類とビルド成果物
| 拡張子 / ファイル | 役割 | ビルド経路 |
|---|---|---|
.go | Go ソースコード | 入力 |
go.mod | モジュール定義(モジュール名・Go バージョン・依存) | プロジェクトルート |
go.sum | 依存のチェックサム(ハッシュ検証) | 自動生成 |
実行バイナリ(拡張子なし / .exe) | OS ネイティブ単一バイナリ | go build の出力 |
_test.go | テストコード(同パッケージ内) | go test が拾う |
Go は 中間ファイル(.class / .pyc 等)をユーザーに意識させない 設計です。$GOCACHE に隠れてはいますが、開発者が直接触ることはまずありません。配布物は単一バイナリで完結し、ランタイムや libc を別途配る必要がない(CGO を使わない限り)のが大きな利点です。
「Hello, World」
package main
import "fmt"
func main() {
fmt.Println("Hello, World")
}
ビルドと実行:
$ go mod init example.com/hello
$ go build -o hello
$ ./hello
Hello, World
# クロスコンパイル(Linux 上で Windows 用バイナリを作る)
$ GOOS=windows GOARCH=amd64 go build -o hello.exe
パッケージ管理・ビルドツール
Go の依存管理は Go Modules(1.11 から導入、1.16 で正式デフォルト)が標準です。go.mod にモジュールパス・Go バージョン・依存を書き、go.sum でハッシュを固定します。
go mod init example.com/myapp # 初期化
go get github.com/gin-gonic/gin # 依存追加
go build ./... # 全パッケージビルド
go test ./... # 全テスト実行
go vet ./... # 静的解析
gofmt -w . # コード整形
go run main.go # コンパイル + 実行(中間バイナリは破棄)
関連言語との比較
| 項目 | Go | Rust | Java | Python |
|---|---|---|---|---|
| 型システム | 静的・GC あり | 静的・GC なし(所有権) | 静的・GC あり | 動的 |
| 配布 | 単一バイナリ | 単一バイナリ | JAR + JVM 必要 | ソース + ランタイム |
| 並行処理 | goroutine + channel | async / await + Send/Sync | Thread / Virtual Thread | asyncio / GIL 制約 |
| 学習コスト | 低(言語仕様が小さい) | 高(所有権が壁) | 中 | 低 |
| コンパイル速度 | 非常に速い | 遅い | 速い | —(インタプリタ) |
注意点・落とし穴
- エラー処理が冗長:
if err != nil { return err }が頻出。例外がないので、エラーは値として明示的に伝播させる必要がある。 - ループ変数のスコープ:1.22 未満では
for _, v := range items { go func() { use(v) }() }のvが共有され、典型的バグになる。1.22 以降はループ毎に新しい変数が作られるので解消。 - nil interface ハマり:型情報を持つ nil(typed nil)と純粋な nil は
==比較で挙動が違う。 - 循環インポート禁止:パッケージ A → B → A は許可されない。設計段階でレイヤを切る必要がある。
- ジェネリクスは後付け:標準ライブラリの多くが
interface{}ベースで設計されているため、新旧 API が混在しがち。
関連リンク
- プログラミング・スクリプト(親カテゴリ)
- ファイル拡張子とは(概論)
- プログラミング言語(カテゴリ)
- Python(.py)
- Rust(.rs)
- Java(.java / .class / .jar)
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15
- 【DB2】テーブル定義からDDL(CREATE TABLE)を生成する方法 2026-10-15 12:30:38
- Db2エラー一覧|SQL0911Nの理由コード・SQL0805Nと安全な調査 2026-10-15 12:30:38