
2026/03/29 7:15
「私の代わりにGoのバージョンを決定するのはやめてください。」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
ファイルのgo.mod行は、モジュールをビルドしたコンパイラではなく、そのモジュールに必要な 最小 Go バージョンを宣言します。Go 1.21 以降、このディレクティブには完全なパッチ番号(例:go <version>)を含める必要がありますが、まだ多くのプロジェクトでは単にgo 1.21.0と書かれています。これにより、下流のモジュールは必ずそのバージョン以上を採用せざるを得なくなり、アップグレードできない消費者にとって破壊的になる可能性があります。1.21最小バージョン要件は「ウイルス」のように拡散します:あなたのモジュールをインポートするプロジェクト全てがその要件を継承します。そのため、
のような高いバージョンを設定すると、すべての下流ユーザーはそのコンパイラまたはそれ以降にロックされます。開発者側でトランジティブインポーターに最新の Go を強制する義務はなく、単に互換性のある最低バージョンを設定すれば十分です。たとえパッケージが特定のパッチリリースでしか動作しない場合でも、他のバージョンが全く機能しない限り、ディレクティブは最低互換性バージョンを反映するべきです。1.25.7のようなツールはデフォルトで最新の Go リリースを挿入します―これは悪い慣行でありユーザーが修正すべきです。また、GitHub Actions のgo mod initはactions/setup-goディレクティブを誤用する場合があります。代わりにgoディレクティブやその他のメカニズムに依存すべきです。toolchainファイルを監査し、正確で最小限のパッチレベルを含めるよう修正すると、無音のバージョンロックインを防ぎ、Go エコシステム全体で互換性を維持できます。go.mod
本文
go.mod の
ディレクティブについてgo
-
必須項目
が必ず記述されます。go <バージョン番号> -
Go 1.21 以降の変更点
バージョンにフルパッチ番号(例:
)を含めるようになりました。1.21.0
多くのプロジェクトが誤って
の形式で記述し、結果として多くの人々に影響しています。1.21 -
意味
このバージョンは「あなたのプロジェクトがコンパイル可能な最低限の Go バージョン」を示します。- あなた自身が使用するバージョンではなく、
- プロジェクトを依存している全てのユーザーに対しての 最小要件 です。
-
影響範囲
に書いたバージョンは、直接あるいは間接的にあなたをインポートするすべてのプロジェクトに伝播します。go.mod
例:
と書けば、依存者は必ず Go 1.25.7+ を使用しなければなりません。1.25.7
FAQ
-
「最新バージョンを使うべきでは?」
ライブラリの利用者が常に最新バージョンである必要はありません。
「最小要件」だけを設定すれば十分です。 -
ビルド時に最新版を使用したい場合
等のツールは、デフォルトでactions/setup-go
のgo.mod
ディレクティブを参照しますが、これは望ましくありません。go
必要なら toolchain ディレクティブや別途指定したバージョンを使用してください。 -
Go が最新バージョンをデフォルトで設定する理由は?
は最新バージョンを自動的に挿入します。go mod init
これは「便利」だと考えられていますが、実際には誤ったデフォルトです。
必要なら手動で下位バージョンへ戻すことが可能です。 -
パッチリリースへの依存
コードが特定のパッチにのみ正しく動作する場合でも、
ディレクティブにそのパッチを記載するのは推奨されません。go
それが唯一コンパイル可能なバージョンであることが明らかな場合を除きます。 -
結論
ディレクティブは「viral」な性質を持ち、あなたのプロジェクトを利用する全ての人に影響します。go
そのため、できるだけ低いバージョン番号(最低限必要なもの)を設定し、他者が自ら選択できるようにしておくことが重要です。