← 記事一覧へ

Go 学習記録(12):パッケージとモジュール

package と module を区別し、go.mod、go.sum、依存管理、GOPROXY、replace を整理します。

1. package と module を区別する

package はソースをまとめる単位です。module は go.mod で管理するパッケージのまとまりです。一つの module に複数の package を置けるので、各ディレクトリに go.mod を作る必要はありません。公式の モジュール構成の例 で、ディレクトリと import パスの関係を確認できます。

同じディレクトリの通常の Go ファイルは、一般に同じパッケージに属します。外部テストでは xxx_test パッケージを使う場合があります。main パッケージの main() が実行開始点です。

最小の構成を示します。

hello/
├── go.mod
├── main.go
└── greeting/
    └── greeting.go

次のコマンドを hello ディレクトリで実行します。

go mod init example.com/hello

greeting/greeting.go:

package greeting

func Message() string {
	return "hello, Go"
}

main.go:

package main

import (
	"example.com/hello/greeting"
	"fmt"
)

func main() {
	fmt.Println(greeting.Message())
}

プロジェクト直下で go run . を実行すると、hello, Go が出力されます。import パスは module のパスとサブディレクトリから構成され、ローカルのディスクパスではありません。

2. import の形式

通常の import では、パッケージ名を使って公開された名前へアクセスします。名前の衝突には別名を使えます。

import myjson "encoding/json"

ほかに二つの形式があります。import _ "包路径" は初期化などの副作用だけを利用し、import . "包路径" は公開名を現在のファイルのスコープに取り込みます。後者は名前の出所が分かりにくくなるため、普通の業務コードではあまり必要ありません。

詳しい規則は Go の仕様のパッケージと import。

3. go.mod と go.sum

go.mod は module のパス、Go のバージョン要件、依存などを記録します。go.sum は取得したモジュールの内容のチェックサムを保存します。依存の選択全体を固定する、従来型のロックファイルではありません。

通常は両方をコミットします。依存の選択や各指令の意味は、Go Modules Reference を参照します。

原有模块记录

4. 依存管理コマンドの役割

まず 公式の依存管理ガイド に沿って、依存の変更とツールの導入を区別します。

コマンド用途
go mod init 模块路径モジュールを作る
go mod tidyソースとテストに合わせて依存を追加・整理する
go get 包路径@版本現在のモジュールの依存バージョンを変更する
go mod download依存モジュールを取得する
go list -m all依存モジュールの一覧を表示する
go mod graph依存グラフを表示する
go mod verifyローカルキャッシュの改変を調べる
go install 工具路径@版本指定バージョンの実行ツールを導入する

CLI の導入には通常 go install ...@版本 を使い、go get を汎用的なツール導入コマンドと考えないようにします。module を変更したら go mod tidy と go test ./... を実行し、差分を確認して不要な大量更新を避けます。

5、GOPROXY

まず現在の値を確認します。

go env GOPROXY

必要なら、例えば次のように設定します。

go env -w GOPROXY=https://goproxy.cn,direct

これは現在のターミナルだけでなく、Go ツールチェーンの永続設定を変更します。プロキシはネットワークと組織の要件に合わせて選びます。

カンマ区切りのリストは通常、404 または 410 の場合に次の取得先を試します。すべての失敗で切り替わるわけではありません。ネットワークの調査では、この違いが重要です。モジュールの取得規則。

原有 GOPROXY 设置记录

6. replace の正しい使い方

replace はモジュールをローカルディレクトリや別のバージョンに置き換えます。go.mod 内の指令で、コマンドから編集するには go mod edit -replace を使います。go mod replace というコマンドはありません。

二つのモジュールを同時に開発する例です。

module example.com/hello

go 1.24

require example.com/common v0.0.0

replace example.com/common => ../common

プロジェクト内で、次のようにも実行できます。

go mod edit -replace=example.com/common=../common
go mod tidy

置換先のディレクトリも、モジュールである必要があります。replace だけでは依存は追加されません。また、主モジュールのローカル置換は、そのライブラリの利用者へ自動では適用されません。公開前にローカルパスの置換を確認します。go.mod の replace の説明。

7. プロジェクトを整える

ソースは gofmt で整形し、コミット前にテストします。必要な依存だけを追加します。依存にはコードの削減だけでなく、更新や保守の作業も伴います。

以前の規約のスクリーンショットは記録として残します。実際の規則は、公式文書と現在のプロジェクトの約束を優先します。

编码规范旧记录 1

编码规范旧记录 2

编码规范旧记录 3

この記事の日付について

旧サイトに記載された日付を保持しています。実際に書き始めた時期は、これより早い可能性があります。

同じシリーズ · Go の基礎学習

前の記事Go 学習記録(11):インターフェース ←次の記事Go 学習記録(13):テスト →