go fixが完全に生まれ変わった

2026年2月にリリースされたGo 1.26で、go fixサブコマンドが完全に書き直されました。以前のgo fixは比較的シンプルなリファクタリングツールでしたが、新しいバージョンではコードベースを最新のGo機能に合わせて自動的にモダナイズする本格的なツールに進化しています。

Go 1.18でジェネリクスが導入されて以降、言語仕様やライブラリに多くの改善が加わってきました。たとえば、マップのキーをスライスに集める処理は、以前はループで書く必要がありましたが、今はmaps.Keysという関数一つで済みます。こうした「最新の書き方に置き換えられるパターン」を自動検出して修正してくれるのが、新しいgo fixの役割です。

基本的な使い方

使い方はとてもシンプルです。プロジェクトのルートディレクトリで以下のコマンドを実行するだけで、配下の全パッケージが対象になります。

$ go fix ./...

成功するとソースファイルが直接更新されます。変更内容を事前に確認したい場合は、-diffフラグを使うと差分だけを表示してくれるので安心ですね。

$ go fix -diff ./...

実行前にgitの状態をクリーンにしておくと、go fixによる変更だけを一つのコミットにまとめやすくなります。コードレビューする側にとっても、変更の意図が明確になるのでおすすめです。

どんな修正が自動で行われるのか

go fixには複数の「フィクサー(fixer)」が組み込まれており、それぞれが特定のパターンを検出して修正します。利用可能なフィクサーの一覧は以下のコマンドで確認できます。

$ go tool fix help

主なフィクサーをいくつか紹介しますね。

anyフィクサー

interface{}anyに置き換えます。Go 1.18で導入されたエイリアスですが、既存のコードベースには古い書き方が残っていることが多いです。見た目もスッキリするので、地味に嬉しい修正です。

forvarフィクサー

Go 1.22以前は、forループ内でx := xのように変数を再宣言して各イテレーションで新しい変数を確保する書き方が一般的でした。Go 1.22でforループのセマンティクスが変更されたため、このパターンは不要になっています。forvarフィクサーはこの冗長な再宣言を自動で除去してくれます。

minmaxフィクサー

if/elseで書かれた最小値・最大値の比較ロジックを、組み込み関数のmin/maxに置き換えます。可読性が格段に上がるので、個人的にはこれが一番インパクトの大きい修正だと感じました。

mapsloopフィクサー

マップに対する明示的なループを、mapsパッケージの関数呼び出しに置き換えます。ジェネリクスの恩恵を受けた新しいAPIを活用する形ですね。

特定のフィクサーだけを実行する方法

大規模なプロジェクトでは、すべてのフィクサーを一度に適用するとレビューの負担が大きくなることがあります。そういう場合は、フラグで特定のフィクサーだけを有効にできます。

$ go fix -any ./...          # anyフィクサーのみ
$ go fix -any=false ./...    # any以外の全フィクサー

段階的に適用してコミットを分けることで、コードレビューのハードルを下げられるのは実用的だなと思います。

クロスプラットフォーム対応

go fixはgo buildと同様に、一度の実行で特定のビルド構成のみを解析します。複数のOS・アーキテクチャ向けにタグ付けされたファイルがある場合は、GOOSとGOARCHを変えて複数回実行すると網羅性が上がります。

$ GOOS=linux GOARCH=amd64 go fix ./...
$ GOOS=darwin GOARCH=arm64 go fix ./...
$ GOOS=windows GOARCH=amd64 go fix ./...

複数回実行することで「相乗的な修正」が見つかるケースもあるそうです。

セルフサービス分析ツールとしての拡張性

今回のgo fixの刷新では、モジュールメンテナーや組織が独自のガイドラインやベストプラクティスをツールに組み込める「セルフサービス」分析ツールとしての方向性も示されています。

これはRustのclippyのような「リンターを超えた自動修正」のアプローチに近いものと言えそうです。静的解析の基盤を活かして、プロジェクト固有のコード品質ルールを適用できるようになれば、大規模チームでの開発生産性がさらに向上するでしょう。

実際に使ってみた所感

Go言語はバージョンアップのたびに新機能が追加される一方で、後方互換性を非常に大切にしています。そのため、古い書き方でも動き続けてしまい、コードベースが「動くけど古い」状態になりがちです。

go fixはその問題に対する公式の回答で、「ツールチェーンを更新したらgo fixを回す」という習慣を取り入れるだけで、コードベースを常にモダンな状態に保てます。AIコーディングエージェントに頼る前に、まず公式ツールでできることをやるのが大事かもしれません。

まとめ

Go 1.26のgo fixは、レガシーコードを自動的に最新のイディオムに変換してくれる実用的なツールに生まれ変わりました。-diffでの事前確認、フィクサーの個別実行など、実務に配慮した設計も好印象です。

詳しくはGo公式ブログの記事goコマンドのドキュメントをチェックしてみてください。