プロンプトとコンテキスト
あるプロジェクトで Go 1.26 を使用して新しいモジュールを初期化します。生成された go.mod には go 1.25.0 が含まれる場合があります。コンパイル、依存関係の解決、および CI への影響を説明し、安全なアップグレード計画を提案してください。
面接官が評価するポイント
- ツールチェーンのバージョン、
goディレクティブ、および依存関係の最小要件の分離。 - 互換性のメリットと新しい言語機能の境界の説明。
- 検証可能でロールバック可能なモジュールアップグレードの設計。
明確化のための質問
- サービスはサポート対象の古いツールチェーンとの互換性を維持する必要がありますか、それとも今すぐ Go 1.26 の機能を使用しますか?
- 本番環境、開発環境、CI は同じツールチェーンに固定されていますか?
- より高い最小 Go バージョンを宣言している依存関係はありますか?
30秒の回答
Go 1.26 で go mod init がより低い go ディレクティブを選択するのは、新しいモジュールがサポート対象のツールチェーンとの互換性を維持できるようにするためです。そのディレクティブは実際にビルドを実行しているコンパイラそのものではなく、古いコンパイラで Go 1.26 専用の API を利用できるようにするものでもありません。私なら互換性の目標を確認し、CI でツールチェーンを固定し、明示的に go get go@version を実行するか go.mod を編集した上で、リリース前に最小サポートバージョンでテスト、go mod tidy、およびビルドを実行します。
ステップバイステップの解決策
goディレクティブはモジュールの最小言語・ツールチェーンセマンティクスを記録し、インストールされた Go バイナリが実行者となります。- 安定版の Go 1.26 ツールチェーンは
go 1.25.0でモジュールを初期化します。プレリリース版のツールチェーンは1つ低いバージョンを選択します。これにより、サポート対象のツールチェーンを誤って除外することを防ぎます。 - コードが Go 1.26 の構文や標準ライブラリ API を必要とする場合は、最小バージョンを明示的に引き上げ、CI、開発コンテナ、リリースイメージを一致させます。
go mod initの後、明示的なツールチェーン要件を意図する場合はgo get go@1.26.0を使用します。依存関係グラフを無視して1行だけを変更してはいけません。- サポートされる最小バージョンおよび最新バージョンで
go test ./...、go vet ./...、およびビルドを実行します。生成コード、ビルドタグ、ターゲットプラットフォームを含めます。 go.mod、go.sum、および再現可能ビルドのメタデータを確認します。検証が失敗した場合は、バージョンの変更をロールバックしてチェックを再実行します。
模範回答
私は「Go 1.26 の使用」を実行ツールチェーン、モジュールの最小バージョン、依存関係の最小バージョンに分けて考えます。go mod init による低めのデフォルト値は互換性ポリシーによるものです。これにより、新しいモジュールがまだサポートされているツールチェーンを対象にできるようになりますが、本番環境が Go 1.25 に切り替わるわけではありません。サービスが Go 1.26 の言語機能や標準ライブラリ機能に依存している場合、私は go get go@1.26.0 で go ディレクティブを引き上げ、CI で同じツールチェーンを固定し、依存関係グラフを確認します。バージョン管理されたロールバックコミットを保持しつつ、最小バージョンでのビルド、最新バージョンでのテスト、go mod tidy、クロスプラットフォームコンパイル、および依存関係チェックを通過することをリリースの条件とします。
よくある間違い
go 1.25.0を Go 1.25 を強制するランタイム設定として扱うこと。- ノート PC だけをアップグレードし、CI、コンテナ、またはリリースジョブをアップグレードしないこと。
go mod tidyや最小バージョンでのビルドを行わずにgo.modを編集すること。- より高い Go バージョンを必要とする依存関係を見落とすこと。
フォローアップの質問と回答
チームが引き続き Go 1.25 をサポートしなければならない場合、Go 1.26 の API を使用できますか?
Go 1.25 でコンパイルされるコード内では使用できません。ビルドタグ、インターフェースアダプター、または別の実装を使用し、両方のバージョンを明示的にテストしてください。
go get go@1.26.0 は何を変更しますか?
モジュールの Go ツールチェーン要件を更新します。生成される go.mod、go.sum、および依存関係の変更は引き続きレビューが必要です。このコマンド自体が互換性を保証するわけではありません。
依存関係が Go 1.26 を必要としているが、サービスが 1.25 を対象としている場合はどうすればよいですか?
互換性のある依存関係のバージョンまたは代替品を探します。その依存関係が不可欠な場合は、サービスの最小バージョンを引き上げ、イメージ、CI、およびロールバック手順をまとめて更新します。
動作が変わっていないことをどのように証明しますか?
最小および最新のツールチェーンで単体テスト、統合テスト、race テスト、ベンチマーク、クロスプラットフォームの結果を比較し、ベースラインに対して成果物とサービスメトリクスを検証します。