Go言語の依存の追加
2026/07/28

go getで追加し、コードから使う

go getは、指定したモジュールを現在のモジュールの依存として足し、ソースをモジュールキャッシュへ取得します。モジュールキャッシュは、ダウンロードしたモジュールのソースをマシン上に蓄える場所です。既定では$GOPATH/pkg/modにあり、プロジェクトをまたいで再利用されます。プロジェクト直下にライブラリ用のディレクトリは増えません。依存の記録は、プロジェクト直下のgo.modに残ります。

go get rsc.io/quote

go getだけでは、そのパッケージの関数はまだ呼べません。ソースにimportを書き、識別子を使います。

package main

import (
    "fmt"

    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}
go run .

fmtのような標準ライブラリはgo getの対象ではありません。Goのインストールに含まれており、go.modrequireにも現れません。

go.modとgo.sum

依存を足すと、go.modrequire行が増えます。使うモジュールとバージョンの記録です。ここに書くバージョンは「このバージョンに固定」ではなく「このバージョン以上」です。自分のgo.modexample.com/lib v1.2.0とあっても、使っている別モジュールのgo.modに同じモジュールがv1.4.0とあれば、ビルドではv1.4.0が使われます。

module example.com/demo

go 1.26

require rsc.io/quote v1.5.2

あわせてgo.sumができます(または更新されます)。ここには、取得したモジュールバージョンの内容のチェックサムが並びます。次回以降のダウンロードで、同じバージョンの中身が変わっていないかを確かめます。

go.modは「何をどのバージョン以上で使うか」、go.sumは「そのバージョンの中身の指紋」です。役割が違うため、両方をソースと同じバージョン管理に含めます。

requireの行末に// indirectと付くことがあります。メインモジュールのパッケージから直接importされていないモジュールの印です。たとえばrsc.io/quoteを足すと、quoteが使うrsc.io/samplerなどがこの印付きで並ぶことがあります。go getした時点でまだimportしていなければ、そのモジュール自身にも同じ印が付きます。自分のコードへimportを足して直接使うようになれば、この印は外れます。手で付け外しする必要はなく、go getgo mod tidyが更新します。

go mod tidyと依存のやめ方

もう一つの正規の足し方は、先にソースへimportを書き、あとから依存を揃えることです。

import "rsc.io/quote"
go mod tidy

go mod tidyは、モジュール内のソースがimportしている集合に合わせて、足りないモジュールをgo.modへ足し、どのパッケージからも使われないモジュールを落とします。go.sumも同様に揃えます。

依存をやめるときも、まずソースからそのimportと使用箇所を消し、もう一度go mod tidyを実行します。参照が無ければ、対応するrequirego.modから外れます。

バージョンの指定

バージョンを明示するときは、モジュールパスのあとに@とバージョンを付けます。

go get rsc.io/[email protected]
go get rsc.io/quote@latest

@latestは、利用できるなかで最も高いリリースバージョンを選ぶ指定です。リリースバージョンがなければプレリリース、タグがなければリポジトリ既定ブランチ先端のバージョンになります。バージョンを省略したgo get rsc.io/quoteも、取得時点で選ばれた具体的なバージョンがrequireに書かれます。go.modrequirelatestという文字列を手で書いてはいけません。バージョンを変えるときはgo getを使います。

メジャーバージョンとimportパス

メジャーバージョンが2以上のモジュールでは、モジュールパスの末尾に/vNが付きます。go getにも、importに書く文字列にも、そのパスを使います。

go get rsc.io/quote/v3@latest
import "rsc.io/quote/v3" // v3のモジュールパス

quote.HelloV3()

import "rsc.io/quote"はv1のモジュールパスです。これではv3のパッケージは使えません。

go getとgo install

現在のモジュールの依存を変えるのがgo getです。揃えるのがgo mod tidyです。

go get rsc.io/quote

一方、バージョン付きで使うgo installは、コマンドを自分の環境へ入れる操作です。実行ファイルは$GOBINがあればそこへ、なければ$GOPATH/binに入り、パスが通っていればその場で呼べます。

go install golang.org/x/tools/cmd/stringer@latest
stringer -help

このプロジェクトのgo.modrequireは増えません。依存を足したいのにgo installだけ実行すると、プロジェクト側の記録は変わらないままになります。