2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go1.26の go fix を実プロダクトに適用して困ったこと

2
Last updated at Posted at 2026-02-13

本記事でやること

Go1.26で大幅に強化された go fix コマンドを実際のプロダクションコードに適用した際に遭遇した注意点を共有します。

注意
この記事は2026年2月13日時点の情報をもとに記載したものです。今後のGo言語や周辺ツールのアップデートにより、本記事で紹介している問題は解消される可能性があります。

対象読者

  • Goを業務で使っている方
  • Go1.26へのアップデートを検討している方
  • go fix コマンドの適用を考えている方

go fix コマンドとは

go fix は、古いGoの書き方を最新バージョンに沿ったイディオムへ自動的に書き換えてくれるコマンドです。Go1.26でこのコマンドが大幅に強化され、interface{}any への統一やループ変数の再代入の削除、strings.Builder への書き換え、新しい new 関数への置換などを一括で行ってくれるようになりました。

go fix ./...

実行自体は非常に簡単ですが、実際にCIを通したり開発環境で動かしてみるといくつかの問題に遭遇しました。

困ったこと

1. ジェネリクスを使ったポインタ変換関数をnew関数に置換しれくれない場合がある

プリミティブ型のポインタを返す関数として、ジェネリクスを使った以下のようなユーティリティ関数をよく見かけます。

func ToPtr[T any](v T) *T {
    return &v
}

Go1.26では new 関数が拡張され値を引数に取れるようになったため、go fix は型ごとに定義された StringPtrIntPtr のようなヘルパー関数を new に置換してくれます。しかし、ToPtr 関数を呼び出している箇所をnew関数に置換してくれない場合があります。

OKなケース :thumbsup:

プリミティブな型の値や関数を受け取っている場合はnew関数への置換が行われます。

// Before
hello := ToPtr("hello")
myFunc := ToPtr(MyFunc())

// After go fix によってnew関数に置換してくれる
hello := new("hello")
myFunc := new(MyFunc())

NGなケース :thumbsdown:

別パッケージ(other)で定義した以下の値を入力している場合はnew関数に置換はされません。

  • 定数(MyConst)
  • 独自型(MyType)
  • 型エイリアス(MyAlias)
package other

const MyConst = "Hoge"
type MyType string
type MyAliasType = string
ToPtr(other.MyConst)
ToPtr(other.MyType("hoge"))
ToPtr(other.MyAliasType("hoge"))

コードベース全体で ToPtr を使っている場合、手動で置換する必要があります。この問題はすでにissueとして報告されています。

2. staticcheckが new(値) パターンを誤検知する

staticcheck(SA4006ルール)は「使用されていない値」を検出するツールですが、Go1.26の新しい new(値) パターンをまだ認識できていません。

そのため、以下のような使い方をしている場合にstaticcheckから誤った警告が出ます。

a := func() int { return 1 }()
b := new(a)  // ← staticcheckは「aは使われていない」と誤検知する

go fix による書き換え自体は正しいのに、CIでstaticcheckが通らなくなるという状況に陥ります。

現時点での回避策としては //nolint:staticcheck を付与してチェックを抑制する方法があります。

a := func() int { return 1 }() //nolint:staticcheck
b := new(a)

こちらもすでにissueが上がっているので、修正を待つという選択肢もあります。

追記(2026/02/18): staticcheck v0.7.0で修正

上記のstaticcheckの誤検知はv0.7.0で修正されました。

staticcheck v0.7.0を取り込んだgolangci-lint v2.10.0がリリースされました。

3. VSCodeユーザーはgoplsの更新が必要

Go1.26で拡張された new 関数は式を引数として受け取れるようになりましたが、VSCodeで古いgoplsを使っている場合、「xxx is not a type」という趣旨のエラーメッセージが表示されます。 go fix で書き換えた直後にエディタが真っ赤になって焦るかもしれません。

スクリーンショット 2026-02-13 14.51.04.png

goplsを更新することで解決できます。

  • Cmd+Shift+PでCommand Plateを呼び出して「Go: Install/Update Tools」を選択

スクリーンショット 2026-02-13 18.54.46.png

  • gopls を選択して更新
    スクリーンショット 2026-02-13 18.55.07.png

go fix を実行する前に、まず開発環境のツール類を更新しておくことをおすすめします。

まとめ

Go1.26の go fix コマンドはコードベースを一括でモダナイズしてくれる非常に便利なツールですが、実際にプロダクションコードに適用してみると周辺ツールが追いついていない部分がありました。

困ったこと 原因 対処法
ジェネリクスのポインタ変換関数が置換されないケースがある go fix が未対応 手動で置換
staticcheckの誤検知 SA4006が new(値) を未認識 //nolint:staticcheck で抑制

これから go fix を適用しようとしている方の参考になれば幸いです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?