Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
new(1.26) ← これすき / kamakura.go #8
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
utagawa kiki
February 27, 2026
Programming
0
62
new(1.26) ← これすき / kamakura.go #8
kamakura.go #8 LT
https://kamakurago.connpass.com/event/383231/
utagawa kiki
February 27, 2026
Tweet
Share
More Decks by utagawa kiki
See All by utagawa kiki
tparseでgo testの出力を見やすくする
utgwkk
2
550
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
4
1k
自動で //nolint を挿入する取り組み / Gopher's Gathering
utgwkk
1
1.8k
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
3.3k
君たちはどうコードをレビューする (される) か / 大吉祥寺.pm
utgwkk
21
17k
Dive into gomock / Go Conference 2024
utgwkk
14
8.4k
Goでリフレクションする、その前に / Kansai.go #1
utgwkk
4
3.7k
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
utgwkk
7
4.3k
ありがとう、create-react-app
utgwkk
4
12k
Other Decks in Programming
See All in Programming
Package Management Learnings from Homebrew
mikemcquaid
0
280
Python’s True Superpower
hynek
0
190
並行開発のためのコードレビュー
miyukiw
2
2k
文字コードの話
qnighy
41
16k
grapheme_strrev関数が採択されました(あと雑感)
youkidearitai
PRO
1
140
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
130
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
PRO
0
200
Ruby x Terminal
a_matsuda
4
430
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1.1k
iOSアプリでフロントエンドと仲良くする
ryunakayama
0
120
Railsの気持ちを考えながらコントローラとビューを整頓する/tidying-rails-controllers-and-views-as-rails-think
moro
4
350
あなたはユーザーではない #PdENight
kajitack
4
280
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
82
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.1k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
80
Are puppies a ranking factor?
jonoalderson
1
3k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
93
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
660
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Transcript
new(1.26) ← これすき id:utgwkk / @utgwkk (うたがわきき) 2026/2/27 kamakura.go #8
1
自己紹介 • うたがわきき (@utgwkk) • 株式会社はてな ◦ Webアプリケーションエンジニア ◦ 京都在住
• 好きなパッケージはreflect 2
3 合計 88 枚のスライド 300 / 88 = 3.41
new(1.25) 4
5 Go 1.25までのnew関数 • 指定された型のポインタを返す ◦ buf := new(bytes.Buffer) •
引数に式を渡せない
涙ぐましいコード こういうコードを書いたことがある人 ? str := "string" strPtr := &str 6
便利関数でしのぐ こういう関数を書いたことがある人 ? func Ptr[T any](t T) *T { return
&t } 7
世界がポインタを作りたがっている • aws.String (aws-sdk-go-v2) • lo.ToPtr (samber/lo) • などなど •
ポインタを作るニーズが絶えない 8
2026/2/10 (JSTでは2/11) 9
🎉Go 1.26 Released 🎉 10
new(1.26) 11
Go 1.26のnew関数 new関数の引数として式を渡せるようになった 12
涙ぐましいコード (before) str := "string" strPtr := &str 13
全てが輝いて見える (after) strPtr := new("string") 14
サイコ〜〜〜〜〜 15
今すぐ func[T](T) *T を捨てる • go fixコマンドで実現できる 16
今すぐ func[T](T) *T を捨てる • go.modにgo 1.26って書く • go fix
-newexpr を実行する ◦ 既存の呼び出しも置き換えてくれる ◦ //go:fix inlineコメントも付け足す 17
//go:fix inlineってなに • 関数をインライン化するためのdirective • go fix -inlineコマンドでインライン化できる 18
go fix -inlineの注意点 • ジェネリクスの型引数を渡した関数呼び出し しかインライン化されない ◦ Ptr[int](1) はインライン化される ◦
Ptr(1) はインライン化されない ◦ go fix -newexpr ではインライン化される • 現状そういう制約らしい 19
go fix -newexprなどの仕組み • modernizeパッケージによって実現 • ルールごとの静的解析器 (Analyzer) の実装が ある
◦ すごくざっくり言うとfixできるESLintのルール 20
modernizeパッケージを見る • Analyzerがある=モダンな書き方ができる • 全人類見たほうがいい • ということで…… 21
modernizeパッケージの Analyzer全部見る id:utgwkk / @utgwkk (うたがわきき) 2026/2/27 kamakura.go #8 22
はじめに • スライド公開するので時間が足りなかった分 はそっちを見てください 23
24個のAnalyzer • appendclipped • bloop • any • errorsastype •
fmtappendf • forvar • mapsloop • minmax • newexpr • omitzero • plusbuild • rangeint 24 • reflecttypefor • slicescontains • slicesdelete • slicessort • stditerators • stringscut • stringscutprefix • stringsseq • stringsbuilder • testingcontext • unsafefuncs • waitgroup
appendclipped • スライスの結合をシンプルにする ◦ append関数→slices.Concat • Go 1.22 25
appendclipped (before) append(append(s, s1...), s2...) 26
appendclipped (after) slices.Concat(s, s1, s2) 27
bloop • ベンチマークで b.N ではなく b.Loop() の値 を使うforループに書き換える • Go
1.24 • デフォルトでは無効 ◦ ベンチマーク結果が変わりうる 28
bloop (before) for i := 0; i < b.N; i++
{ // benchmark code } 29
bloop (after) for range b.Loop() { // benchmark code }
30
any • interface{} をanyに置き換える • Go 1.18 31
errorsastype • errors.Asをerrors.AsTypeに置き換える ◦ errors.AsTypeはerrors.Asのジェネリック版 • Go 1.26 32
errorsastype (before) var myErr *MyError if errors.As(err, &myErr) { //
myErr != nil } 33
errorsastype (after) if myErr := errors.AsType[*MyError](err); myErr != nil {
// myErr != nil } 34
fmtappendf • []byte(fmt.Sprintf(...)) を fmt.Appendf() に置き換える ◦ アロケーションが減って嬉しい • Go
1.19 35
fmtappendf (before) []byte(fmt.Sprintf("%s", x)) 36
fmtappendf (after) fmt.Appendf(nil, "%s", x) 37
forvar • ループ変数のシャドウイングをなくす ◦ 並行処理でループ変数が書き換えられるのを防ぐ 過去のイディオム • Go 1.22 38
forvar (before) var wg sync.WaitGroup for i := range 10
{ i := i wg.Go(func() { fmt.Println(i) }) } wg.Wait() 39
forvar (after) var wg sync.WaitGroup for i := range 10
{ wg.Go(func() { fmt.Println(i) }) } wg.Wait() 40
mapsloop • mapに対するループをmapsパッケージの 関数呼び出しに置き換える ◦ 文脈に応じて置換後の関数は変わる ▪ maps.Copy, maps.Insert, maps.Clone,
maps.Collect • Go 1.23 41
mapsloop (before) y := make(map[string]int) for k, v := range
x { y[k] = v } 42
mapsloop (after) maps.Copy(y, x) 43
minmax • if-elseによる最小値・最大値の計算を min,max関数に置き換える • Go 1.21 44
minmax (before) var x int if a < b {
x = a } else { x = b } 45
minmax (after) var x int x = min(a, b) 46
newexpr • func [T](t T) *T というシグネチャを持つ関 数呼び出しをnew関数に置き換える ◦ //go:fix
inlineコメントも足す • Go 1.26 47
omitzero • encoding/jsonのstruct tagのomitemptyを omitzeroに置き換える • Go 1.24 • デフォルトでは無効
◦ omitemptyとomitzeroは微妙に意味が変わる 48
pluszero • //+build 形式のビルドコメントを //go:build 形式に置き換える • Go 1.18 49
rangeint • for i := 0; i < n; i++
{ ... } というforループ を for i := range n { ... } に置き換える • Go 1.22 50
reflecttypefor • reflect.TypeOfをreflect.TypeForに 置き換える ◦ ジェネリクス版 ◦ interfaceのreflect.Typeが取りやすくなった • Go
1.26 • ランタイムの型が不定の場合は置き換えない 51
reflecttypefor (before) t := reflect.TypeOf((*error)(nil)) 52
reflecttypefor (after) t := reflect.TypeFor[error]() 53
slicescontains • forループでスライスの要素を探すコードを slices.Contains, slices.ContainsFuncに 置き換える • Go 1.21 54
slicescontains (before) for _, x := range xs { if
x == 0 { return true } } return false 55
slicescontains (after) return slices.Contains(xs, 0) 56
slicesdelete • スライスの特定範囲の要素を削除するコード をslices.Deleteに置き換える • Go 1.21 • デフォルトでは無効 ◦
書き換え元のコードとメモリの取り扱いが異なる 57
slicesdelete (before) s = append(s[:i], s[j:]...) 58
slicesdelete (after) s = slices.Delete(s, i, j) 59
slicessort • sort.Slice関数によるソートを slices.Sort関数に置き換える • Go 1.21 60
slicessort (before) sort.Slice(s, func(i, j int) bool { return s[i]
< s[j] }) 61
slicessort (after) slices.Sort(s) 62
stditerators • Len/At形式のAPIをiteratorに置き換える ◦ go/typesやreflectパッケージなど • Go 1.23 63
stditerators (before) for i := 0; i < x.Len(); i++
{ use(x.At(i)) } 64
stditerators (after) for elem := range x.All() { use(x.At(i)) }
65
stringscut • strings.Indexを使った文字列を分けるコード をstrings.Cutに置き換える • Go 1.18 66
stringscut (before) idx := strings.Index(s, substr) if idx >= 0
{ return s[:idx] } 67
stringscut (after) before, _, ok := strings.Cut(s, substr) if ok
{ return before } 68
stringscutprefix • strings.HasPrefixとstrings.TrimPrefixを組 み合わせたコードをstrings.CutPrefixに置き 換える ◦ suffixも同様 (strings.CutSuffixに置き換える) • Go
1.20 69
stringscutprefix (before) if strings.HasPrefix(s, prefix) { use(strings.TrimPrefix(s, prefix)) } 70
stringscutprefix (after) if after, ok := strings.CutPrefix(s, prefix); ok {
use(after) } 71
stringsseq • 文字列をsplitしてforループするコードでの strings.Splitの呼び出しをstrings.SplitSeq に置き換える ◦ iteratorになるので効率がよい • Go 1.24
72
stringsbuilder • +=演算子による文字列結合を strings.Builderによる文字列組み立てに置き 換える • Go 1.10 73
stringsbuilder (before) var s = "[" for x := range
seq { s += x s += "." } s += "]" use(s) 74
stringsbuilder (after) var s strings.Builder s.WriteString("[") for x := range
seq { s.WriteString(x) s.WriteString(".") } s.WriteString("]") use(s.String()) 75
testingcontext • テスト中でcancelされるcontextを作るコー ドを t.Context メソッドに置き換える ◦ t.Contextが返すcontextはテスト終了時に 自動的に中断される •
Go 1.24 76
testingcontext (before) ctx, cancel := context.WithCancel(context.Background()) defer cancel() 77
testingcontext (after) ctx := t.Context() 78
unsafefuncs • unsafe.Pointerとuintptrによるポインタ演 算をunsafe.Addに置き換える • Go 1.17 • 普通に過ごしていたら世話にならないのでは ◦
世話にならないといいですね 79
unsafefuncs (before) unsafe.Pointer(uintptr(ptr) + uintptr(n)) 80
unsafefuncs (after) unsafe.Add(ptr, n) 81
waitgroup • sync.WaitGroupを使った並行処理のコード をシンプルに書き換える ◦ wg.Addとwg.Doneのタイミングに気をつけていた ◦ wg.Goメソッドを呼ぶだけでよくなる • Go
1.25 82
waitgroup (before) wg.Add(1) go func() { defer wg.Done() ... }()
83
waitgroup (after) wg.Go(func(){ ... }) 84
おつかれさまでした • appendclipped • bloop • any • errorsastype •
fmtappendf • forvar • mapsloop • minmax • newexpr • omitzero • plusbuild • rangeint 85 • reflecttypefor • slicescontains • slicesdelete • slicessort • stditerators • stringscut • stringscutprefix • stringsseq • stringsbuilder • testingcontext • unsafefuncs • waitgroup
参考 • godoc ◦ fmt ◦ encoding/json ◦ errors ◦
golang.org/x/tools/go/analysis/passes/modernize ◦ maps ◦ reflect ◦ slices ◦ strings ◦ sync ◦ testing ◦ unsafe 86
参考 • Go 1.26 Release Notes - The Go Programming
Language • Using go fix to modernize Go code - The Go Programming Language • Go 1.26で go fix が面白くなった | フューチャー技術ブログ • go fix -inlineで型引数を省略した関数呼び出しがインライン 化できないことを示すコード 87
まとめ • new(1.26) をどうぞよろしくお願いします • modernizeパッケージが提供するAnalyzerを 知ってモダンなGoのコードを書きましょう ◦ LLMが古いコードを吐いてくるのでモダンなコードを 浸透させる必要がある、みたいな話がGo
Blogに書い てある 88