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
mackee
June 12, 2026
Programming
860
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.5k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
6.7k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.6k
ワンバイナリWebサービスのススメ
mackee
10
9.3k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
940
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
contenteditable と日本語入力に向き合う
colorful12
0
200
sbt 2.0: takeoff
eed3si9n
0
160
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
910
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
510
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
1.6k
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5.2k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
300
Agents on Rails - Rails at Scale 2026
irinanazarova
0
570
JIS keyboard support in Omarchy
lef237
0
140
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
160
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
280
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
530
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
630
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
380
Site-Speed That Sticks
csswizardry
13
1.6k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Facilitating Awesome Meetings
lara
57
7.2k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
360
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