Go言語のエコシステムにおいて、ライブラリやフレームワークの導入を支える最も基本的なコマンドがgo getです。

かつてのGo言語では、ツールのインストールとライブラリの追加の両方にgo getが使われていましたが、現在のGoモジュール(Go Modules)が標準となった環境では、その役割は明確に定義されています。

2026年現在の開発現場においても、「依存関係を管理する go get」「バイナリをインストールする go install」の使い分けを正しく理解することは、プロジェクトの安定性とセキュリティを維持するために欠かせません。

本記事では、現代的なGo開発におけるgo getの活用術と、混同しやすい周辺コマンドとの違いを詳しく解説します。

go get の役割と基本的な使い方

現在のGo言語において、go getの主要な役割は「プロジェクトの依存関係(go.modファイル)の更新」にあります。

特定のパッケージをプロジェクトに取り込んだり、既存のライブラリを特定のバージョンへアップグレード、あるいはダウングレードしたりする際に使用します。

パッケージの新規追加

新しい外部ライブラリをプロジェクトに導入する場合、プロジェクトのルートディレクトリで以下のようにコマンドを実行します。

go
// 外部パッケージ(例:google/uuid)を依存関係に追加する
go get github.com/google/uuid
実行結果
go: downloading github.com/google/uuid v1.6.0
go: added github.com/google/uuid v1.6.0

この操作により、go.modファイルに該当パッケージとそのバージョンが追記され、go.sumファイルにはそのパッケージのチェックサムが記録されます。

これにより、プロジェクトに関わる全開発者が同一バージョンのソースコードを使用することが保証されます。

バージョンの指定方法

go getはデフォルトで最新の安定版(タグが付与された最新バージョン)を取得しようとしますが、特定のバージョンを指定することも可能です。

  • セマンティックバージョニングの指定: go get package@v1.2.3
  • 特定のブランチを指定: go get package@main
  • 特定のコミットハッシュを指定: go get package@c85632a
  • 最新版への更新: go get package@latest

特定のセキュリティ修正が含まれるバージョンへ強制的にアップデートしたい場合などは、このバージョン指定機能が非常に重要になります。

go get と go install の決定的な違い

Go 1.16以降、そして2026年現在のモダンな環境において、go getgo install完全に異なる目的で使用されます。

この違いを混同すると、プロジェクトの依存関係を不必要に汚染したり、意図しないバージョンがインストールされたりする原因となります。

コマンド比較表

項目go getgo install
主な目的プロジェクトの依存関係の追加・変更実行可能なバイナリのビルドと配置
影響を受けるファイルgo.mod, go.sumなし(通常は $GOPATH/bin に出力)
いつ使うかライブラリをコード内で import したい時golangci-lint などのツールを使いたい時
推奨される実行場所プロジェクトのルートディレクトリどこでも可(通常はバージョン指定を伴う)

なぜ使い分けが必要なのか

以前のGoでは、go get -u remote/package を実行すると、ソースコードのダウンロードと同時にバイナリのビルド・インストールまで行われていました。

しかし、これでは「ツールをインストールしたいだけなのに、現在のプロジェクトの依存関係が変わってしまう」という副作用が発生していました。

2026年現在では、以下のルールが徹底されています。

  1. プロジェクトで使うライブラリを追加するなら go get
  2. 開発ツール(静的解析ツール、コード生成ツールなど)を自分のPCにインストールするなら go install

例えば、静的解析ツールの staticcheck をインストールする場合は、プロジェクト内で実行するのではなく、以下のようにバージョンを指定して実行するのがマナーです。

Shell
// 特定のプロジェクトに依存させず、ツールとしてインストールする
go install honnef.co/go/tools/cmd/staticcheck@latest

依存関係の更新と管理テクニック

プロジェクトを長期間運用していると、依存ライブラリのアップデートが必要になります。

ここでは、go getを用いた効率的な更新手法を紹介します。

マイナー・パッチバージョンの更新

プロジェクトが依存しているすべてのパッケージを、互換性のある範囲内で最新の状態にするには -u フラグを使用します。

Shell
// 依存関係にあるすべてのパッケージをマイナー/パッチアップデートする
go get -u ./...

ここで重要なのは、「./…」という引数です。

これはカレントディレクトリ以下のすべてのパッケージを対象にすることを意味します。

ただし、一括更新は破壊的変更が含まれるリスクがあるため、実行後は必ずテストスイートを走らせる必要があります。

未使用パッケージの削除(go mod tidy)

go getでパッケージを追加したものの、結局コード内で使用しなかった場合、go.modには不要な定義が残ってしまいます。

これを整理するのが go mod tidy です。

Shell
// 使用されていないモジュールを削除し、不足しているモジュールを追加する
go mod tidy

実務上は、go get で新しいライブラリを試した後に、このコマンドをセットで実行するのがGo開発のスタンダードなワークフローとなっています。

go.mod と go.sum の構造を理解する

go getを正しく使いこなすには、その背後で更新されるファイルの役割を知っておく必要があります。

go.mod:依存関係の設計図

go.mod ファイルには、モジュール名、Goのツールチェーンバージョン、そして直接的・間接的に依存しているパッケージがリストアップされます。

go
module my-project

go 1.26

require (
    github.com/google/uuid v1.6.0
    github.com/lib/pq v1.10.9 // indirect
)

// indirect というコメントが付いているものは、自分のコードで直接 import はしていないが、自分が使っているライブラリが内部で使用している「間接的な依存関係」を指します。

go.sum:改ざん防止と整合性のチェック

go.sum は、特定のバージョンのモジュールがダウンロードされた際のハッシュ値を保持しています。

text
github.com/google/uuid v1.6.0 h1:NIClS+vX9zD7/O0S09p+2Zf9cM0J29p6...
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe...

このファイルが存在することで、他の開発者の環境で go get やビルドが行われた際、「同じバージョン名なのに中身が書き換わっている」といったサプライチェーン攻撃を検知できます。

go.sum は手動で編集してはいけません。

高度な go get 活用術

特定のモジュールのみをダウングレードする

最新バージョンにバグが見つかった場合、意図的に古いバージョンに戻す必要があります。

Shell
// 特定のパッケージを v1.5.0 に戻す
go get github.com/google/uuid@v1.5.0

この操作を行うと、go.mod 内のバージョン指定が書き換わり、プロジェクト全体がそのバージョンを使用するように固定されます。

モジュールの撤回(Retract)への対応

ライブラリの作者が特定のバージョンに重大な問題を発見した場合、そのバージョンを「撤回(retract)」することがあります。

Go 1.16以降の go get は、撤回されたバージョンを取得しようとすると警告を表示します。

text
go: warning: github.com/bad/module@v1.0.2: retracted by module author: contain security vulnerability

このような警告が出た場合は、速やかに推奨されるバージョン(通常は次のパッチバージョン)へ更新するために go get package@latest を実行してください。

プロキシとプライベートモジュール

企業開発などでは、GitHub上の公開リポジトリだけでなく、社内のプライベートリポジトリを go get したい場合があります。

その際、デフォルトのGoプロキシ(proxy.golang.org)はプライベートリポジトリにアクセスできないため、エラーが発生します。

このような場合は、GOPRIVATE 環境変数を設定します。

Shell
// 社内ドメインをプロキシ経由から除外する
export GOPRIVATE=github.com/my-company/*

この設定により、指定したドメインのモジュールを取得する際はプロキシを経由せず、直接ソースコード管理システム(GitHubなど)へアクセスするようになります。

セキュリティと再現性の確保

2026年の開発環境では、ソフトウェア・サプライチェーン・セキュリティへの関心が高まっています。

go get を使用する際は、以下の点に留意してください。

  1. チェックサムデータベースの活用: Goはデフォルトで sum.golang.org を参照し、取得したパッケージが正当なものか確認します。この仕組みを無効にすることは推奨されません。
  2. 脆弱性診断との連携: go get でパッケージを更新した後は、govulncheck ./... を実行して、導入したライブラリに既知の脆弱性が含まれていないか確認する習慣をつけましょう。
  3. CI/CDでの再現性: CI環境では go get を実行するのではなく、go mod download または単に go build を実行します。これにより、go.mod に記述された正確なバージョンが再現されます。

まとめ

Go言語における go get は、単にライブラリをダウンロードするだけのコマンドではありません。

それは、プロジェクトの依存関係という「契約」を管理するためのツールです。

  • go get は、go.mod を更新し、プロジェクトに必要なパーツを揃えるために使う。
  • go install は、プロジェクトのコードとは無関係に、便利なツールを自分のPCに導入するために使う。
  • go mod tidy を併用することで、常にクリーンな依存関係を維持する。

これらの原則を守ることで、プロジェクトのビルド再現性が高まり、チーム開発における「自分の環境では動くのに」といったトラブルを未然に防ぐことができます。

コマンドの特性を正しく理解し、堅牢なGoアプリケーション開発に役立ててください。