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
890
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.6k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
6.9k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.7k
ワンバイナリWebサービスのススメ
mackee
10
9.4k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
990
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
1.1k
Other Decks in Programming
See All in Programming
GraphQL の onError と Nullability のこれから
quramy
0
210
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.2k
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
370
AIが実装を担う時代の「技術設計」と「チームマネジメント」
kamina_zzz
2
240
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
3
1.7k
AI-Powered Domain-Driven Design
ziobrando
0
420
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
300
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
170
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
220
小さなアプリを作って公開するまで
onozaty
0
150
私なりのハーネスエンジニアリング ~独自の言語処理系の開発を通して~
seosoft
0
200
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
1.2k
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
660
Visualization
eitanlees
153
17k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
750
Embracing the Ebb and Flow
colly
88
5.2k
Deep Space Network (abreviated)
tonyrice
0
410
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
820
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.7k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
670
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Navigating Team Friction
lara
192
16k
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