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
utagawa kiki
February 27, 2026
Programming
0
120
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
AI時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
490
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
2.1k
浮動小数の比較について
kishikawakatsumi
0
350
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
110
モジュラモノリスにおける境界をGoのinternalパッケージで守る
magavel
0
3.1k
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
430
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
1
310
Railsの気持ちを考えながらコントローラとビューを整頓する/tidying-rails-controllers-and-views-as-rails-think
moro
4
350
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
190
2026/02/04 AIキャラクター人格の実装論 口 調の模倣から、コンテキスト制御による 『思想』と『行動』の創発へ
sr2mg4
0
630
CSC307 Lecture 14
javiergs
PRO
0
440
今、アーキテクトとして 品質保証にどう関わるか
nealle
0
190
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.6k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
300
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
66
A Soul's Torment
seathinner
5
2.4k
sira's awesome portfolio website redesign presentation
elsirapls
0
170
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Amusing Abliteration
ianozsvald
0
120
Navigating Team Friction
lara
192
16k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
270
Music & Morning Musume
bryan
47
7.1k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
170
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