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
830
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.4k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.5k
ワンバイナリWebサービスのススメ
mackee
10
9.2k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
860
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.2k
perl for shell, awk and sed programmers
mackee
3
2.9k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1.1k
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
1k
Other Decks in Programming
See All in Programming
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
180
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
300
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
180
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.5k
Heart of Swift Concurrency
koher
0
920
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1k
Webの地図
yosuke_furukawa
PRO
6
4.7k
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
220
setup-vp GitLab対応の裏側
naokihaba
0
110
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
520
Security issues being discussed on Web Platforms
petamoriken
0
990
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
5
3.5k
Featured
See All Featured
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
First, design no harm
axbom
PRO
2
1.3k
How GitHub (no longer) Works
holman
316
150k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
460
New Earth Scene 8
popppiees
4
2.6k
Raft: Consensus for Rubyists
vanstee
142
7.7k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
The SEO Collaboration Effect
kristinabergwall1
1
570
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
360
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
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