Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Go1.26のgo fixを実行してみて困ったことを紹介します。golang.tokyo#43のLT資料です。

Avatar for Hiroki Kurasawa

Hiroki Kurasawa

February 18, 2026
Tweet

Other Decks in Programming

Transcript

  1. 自己紹介 • 名前: Kurasawa Hiroki • 所属: 株式会社 ZOZO •

    仕事 ◦ ZOZOTOWNの検索機能/広告枠のバックエンド開発 • 好きなもの ◦ Go言語 / Elasticsearch • 最近作ったもの ◦ Elasticsearchのテストフィクスチャのライブラリ ▪ go-elasticsearch-testfixtures @kurasawah
  2. Go1.26 new関数とは • new関数が拡張され、式を渡せるようになった • ポインタ生成と初期値の設定を1ステップで行えるようになった // 型のゼロ値のポインタしか作れない p :=

    new(int) // *int(値は0) // 初期値を設定するには一時変数が必要 val := 42 p := &val // 値を直接渡せる p := new(42) // *int(値は42) // 関数の戻り値も渡せる t := new(time.Now()) // *time.Time Before After
  3. go fixによるnew関数への置換 func ToPtr[T any](v T) *T { return &v

    } func main() { ToPtr("hoge") ToPtr(MyFunc()) } ジェネリクスを使った関数の場合、呼び出し先で置換できないケースがある //go:fix inline func ToPtr[T any](v T) *T { return new(v) } func main() { new("hoge") new(MyFunc()) } Before After go fix 実行
  4. new関数に置換できないケース package other const MyConst = "Hoge" type MyType string

    type MyAliasType = string -- func main() { ToPtr(other.MyConst) ToPtr(other.MyType("hoge")) ToPtr(other.MyAliasType("hoge")) } • 別パッケージで定義した ◦ 定数を入力した場合 ◦ 独自型を入力した場合 ◦ 型エイリアスを入力した場合 • (もちろん)サードパーティのライブラリで定 義された型もNG
  5. 既にissueとして報告されている cmd/go: fix //go:fix inline doesn't work on new-like function

    with generics #77570 • 特定の型に対する関数(StringPointer)は呼び出し側で new関数に置換できるので、ジェネリクス固有の問題 • マイルストーンにGo1.27が設定されている ◦ Go1.27で修正が入るかも?
  6. golangci-lintがコケた ❯ golangci-lint run ./... SA4006: this value of XXX

    is never used (staticcheck) staticcheck • golangci-lintのデフォルトで有効なlinter • SA4006は「使用されていない値」に対する警告
  7. staticcheckによる警告 a := func() int { return 1 }() b

    := new(a) ❯ golangci-lint run ./... SA4006: this value of a is never used (staticcheck) staticcheckがGo1.26のnew関数に対応できておらず誤検知
  8. 対応 a := func() int { return 1 }() //nolint:staticcheck

    b := new(a) //nolint:staticcheckを付与してチェックを回避
  9. 昨日(2/17)リリースされたgolangci-lint v2.10.0で修正 👏 • 2/13にリリースされたstaticcheck v0.7.0で修正 ◦ SA4006 false positive

    with new(expr) introduced in Go 1.26 • 2/17にリリースされたgolangci-lint v2.10.0でstaticcheck v0.7.0を取り込む ◦ [staticcheck,SA4006] false positives ❯ golangci-lint --version golangci-lint has version 2.10.0 built with go1.26.0 ❯ golangci-lint run ./... 0 issues.
  10. まとめ • ジェネリクスを使ったToPtr関数の呼び出し元がnew関数に置換されないケース ◦ 別パッケージで定義した ▪ 定数を入力した場合 ▪ 独自型を入力した場合 ▪

    型エイリアスを入力した場合 • golangci-lint(staticcheck)がGo1.26のnew関数に対応できておらず誤検知 ◦ 昨日(2/17)リリースされたgolangci-lint v2.10.0で修正済み 本日の内容はQiita記事でもまとめております。