Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Go1.27で導入されるジェネリクスメソッドでできること
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
mackee
June 12, 2026
Programming
850
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Go1.27で導入されるジェネリクスメソッドでできること
kamakural.go #9
mackee
June 12, 2026
More Decks by mackee
See All by mackee
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
1.4k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
6.6k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.6k
ワンバイナリWebサービスのススメ
mackee
10
9.2k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
910
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.2k
perl for shell, awk and sed programmers
mackee
3
3k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1.2k
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
1k
Other Decks in Programming
See All in Programming
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
160
R8 の設定見直しでアプリサイズ削減
andpad
0
190
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
590
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
160
setup-vp GitLab対応の裏側
naokihaba
0
160
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
320
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
速習iPhone Duo対応
yuukiw00w
2
970
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
920
APNsからLive Activityを開始する話
yumnumm
0
160
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
220
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
280
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
7k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Git: the NoSQL Database
bkeepers
PRO
433
67k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
450
Code Review Best Practice
trishagee
74
20k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Amusing Abliteration
ianozsvald
1
330
My Coaching Mixtape
mlcsv
0
340
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Transcript
Go1.27で導入されるジェネリ クスメソッドでできること macopy(@mackee_w) kamakura.go #9
おさらい: Goのジェネリクス (Go 1.18〜) 型パラメータを書けるのは関数と型だけ。メソッドには書けなかった
ちなみにTypeScriptだと メソッドにも型パラメータが書けます
ちなみにTypeScriptだと • TypeScriptの型はコンパイル時に消える(type erasure) ◦ 「実行時にどの型の実体が必要か」という問題がそもそも存在しない • Goはジェネリクスから実体のコードを生成するので、同じようにはいかな い
なぜ書けなかったのか • Goでは「メソッド = インターフェースを実装するもの」だった ◦ インターフェース経由の呼び出しは動的 → どのインスタンス化が実 行時に必要か、コンパイル時に決められない
◦ FAQ「Goにジェネリックメソッドが入ることはないと思われます」
なぜ書けるようになるのか • 2026-01 Goの共同設計者 Robert Griesemer が提案(#77273)→ 約 1ヶ月でaccepted ◦
"concrete methods are a language feature that is useful in itself, irrespective of interfaces" ◦ メソッドはインターフェースのためだけのものじゃない。「レシーバ付き の関数」と考えよう
Go 1.27ではこう書ける
Go 1.27ではこう書ける • レシーバの型パラメータとメソッド自身の型パラメータの二重持ちもOK • stack.Map[int](...) と明示してもいい
実例①: Webフレームワーク tanukirpcのAPI設 計における課題 mackee/tanukirpc … 自作のGo Webアプリフレームワーク。DI機構 (Registry)を Context[Reg]
として持ち回る • 既存メソッドはレシーバ由来の Reg だけで書ける
実例①: Webフレームワーク tanukirpcのAPI設 計における課題 • RouteWithTransformer は変換先の新しい型パラメータ Reg2 が必 要
→ メソッドにできなかった
Go 1.27ならメソッドにできる • APIの統一感が戻ってくる
実例②: テストで作っていた Mustヘルパ 「エラーは出ない前提で1番目の値だけ欲しい」… samber/lo の lo.Must が有名(エラーならpanic) でもテストならpanicではなく t.Fatal
で落としたい。じゃあ t を受け取れば いい?
実例②: テストで作っていた Mustヘルパ • 多値を返す呼び出しは他の引数と混ぜられない(単独引数でなければな らない) • メソッドにして t をレシーバに置ければ解決するのに、型パラメータが書
けない…
というわけで私はこう書いていた • 値をジェネリック構造体に一旦包んで、t はメソッドで後から受ける2段構 え • 「型パラメータはレシーバ経由でしか持てない」時代のイディオム
Go 1.27なら1段で書ける • MustExpect のような中間構造体はもういらない • 標準にも (*testing.T).Must の提案(#54297)がジェネリクスメソッ ド採択で再始動
◦ まだ提案中です。入るかどうかはわからない ◦ ただ、この提案には「testing.TB には足せない」という壁が…
できそうでできないこと • インターフェースのメソッドにジェネリクスは書けない • testing.TB に Must を足せないのはこれ。T/B/F に個別に生やすし かない
できそうでできないこと • ジェネリクスメソッドはインターフェースを実装できないので、既存のイン ターフェースを満たすためにジェネリクスメソッドを書くこともできない • ジェネリック「型」の普通のメソッドがインターフェースを実装するのは従来 どおりOK
その他できないこと • reflectからも見えない(MethodByName で取れない)
標準ライブラリはどう変わる ? Go 1.27で追加されるジェネリクスメソッドのAPIはmath/rand/v2に追加がある • v2設計時にジェネリクスメソッドがなくて、関数 rand.N しか作れなかったや つ •
「メソッドとして自然に書けるAPI」の提案はこれから増えていくはず
まとめ • Go 1.27からメソッドに型パラメータが書けます ◦ 「メソッド = インターフェースのため」から「メソッド = レシーバ付き関
数」への発想の転換 • インターフェース絡みとreflectは割り切り(書けない・実装しない・見えな い) • 手元の「型パラメータを持つためだけの中間構造体」や「メソッドになれな かった関数」は書き直せるかも
参考リンク • #77273 spec: generic methods for Go • #77853
math/rand/v2: add method form of N • #54297 proposal: must: Do(testing.T.Mustの議論) • Go 1.27 Release Notes(draft) • mackee/tanukirpc