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
sync/v2 プロポーザルの 背景と sync.Pool について
Search
matumoto
May 15, 2025
Technology
820
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
sync/v2 プロポーザルの 背景と sync.Pool について
DMM.go #10 での登壇資料です
-
https://dmm.connpass.com/event/346087/
matumoto
May 15, 2025
More Decks by matumoto
See All by matumoto
Go標準パッケージのI/O処理をながめる
matumoto
0
480
testingを眺める
matumoto
1
220
Goトランザクション処理
matumoto
1
94
いまいちどスライスの 挙動を見直してみる
matumoto
0
430
Go1.22のリリース予定の機能を見る
matumoto
0
98
GoのUnderlying typeについて
matumoto
0
250
Typed-nilについて
matumoto
0
390
GoのType Setsという概念
matumoto
0
64
GoのRateLimit処理の実装
matumoto
0
550
Other Decks in Technology
See All in Technology
HacobuにおけるFDEとは/登壇資料(戸井田 裕貴)
hacobu
PRO
1
780
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
10
3.1k
今こそ知りたいAmplifyGen2
mkdev10
2
150
私の推しは「聞いてから進む」AIです -AI-DLCに一人でアプリを作らせた話
yama3133
1
170
生成AIと進める探索的データ分析(2026.10.03 第122回Tokyo.R勉強会)
tatamiya
2
1.4k
自律型 AI をセキュアに実装!Gemini と MIG で作る動的コード実行環境
recruitengineers
PRO
1
210
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
2
870
SDDの運用にめげずに向き合った話
sansantech
PRO
0
130
Google Cloud Next Tokyo 26登壇時のスクリプト
recruitengineers
PRO
0
200
契約書画像からの情報抽出に特化した視覚接地モデルを育てる話
sansantech
PRO
1
140
全社共通データ基盤をつくる。ソニーのDatabricks活用とデータガバナンス設計の裏側
sony
0
420
いちAWSエンジニアのAI活用を振り返る #devio2026 / devio osaka 2026 kawahara
masahirokawahara
2
380
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
The Cult of Friendly URLs
andyhume
79
7k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
480
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
910
A better future with KSS
kneath
240
18k
Designing for humans not robots
tammielis
254
26k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
340
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
690
Transcript
© DMM © DMM CONFIDENTIAL sync/v2 プロポーザルの 背景と sync.Pool について
DMM.go #10 24新卒 松本響輝(matumoto) 2025-05-15
© DMM 2 松本 響輝 (matumoto) • 合同会社DMM.com 開発統括本部マーケティングテクノロジー 部開発チーム
• Goがちょっと好きな24新卒です • X: @matumoto_1234
© DMM 発表の目的 • sync/v2 についてちょっと詳しくなる • 今後注目される機能に目を向ける足がかりになれれば! • 追加される機能の背景や議論を知ってもっとGoを好きに!
• Approveされていない のであくまで参考程度に 3
© DMM 目次 • v2のプロポーザル一覧 • syncパッケージ(v1)のおさらい • インターフェースのメモリ割り当てについて •
sync/v2パッケージのプロポーザル • ジェネリクス対応とv2 • まとめ 4
© DMM CONFIDENTAL v2のプロポーザル一覧
© DMM 6 label:v2 かつ label:Proposal なものは32件もある
© DMM 7 今回、sync/v2 について紹介
© DMM CONFIDENTAL そのまえに
© DMM CONFIDENTAL syncパッケージ (v1)のおさらい
© DMM Go1.24までの sync パッケージの機能 • 代表的なもの ◦ sync.Pool ◦
sync.Map ◦ sync.WaitGroup ◦ sync.Mutex ◦ … 10
© DMM それぞれの概要 • 代表的なもの ◦ sync.Pool → スレッドセーフなキャッシュ(GCの負荷を軽減) ◦
sync.Map → スレッドセーフなmap ◦ sync.WaitGroup → goroutine の待機に ◦ sync.Mutex → 排他制御に ◦ … 11
© DMM 今回 sync.Pool と sync.Map に注目 • 代表的なもの ◦
sync.Pool → スレッドセーフなキャッシュ(GCの負荷を軽減) ◦ sync.Map → スレッドセーフなmap ◦ sync.WaitGroup → goroutine の待機に ◦ sync.Mutex → 排他制御に ◦ … 12
© DMM sync.Pool 型 13
© DMM sync.Pool 型 14 any を返す関数を渡す
© DMM sync.Map 型 15
© DMM sync.Map 型 16
© DMM sync.Map 型 17 メソッドでは基本 any を扱う
© DMM any で扱うことのなにが問題か? 18 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう
© DMM any で扱うことのなにが問題か? 19 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう
© DMM any で扱うことのなにが問題か? 20 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう sync(v1)
では any で扱ってしまっている ...
© DMM any で扱うことのなにが問題か? 21 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう sync(v1)
では any で扱ってしまっている ... インターフェースを介さないジェネリクスで扱い たい!
© DMM CONFIDENTAL インターフェースを 介したくない理由って ...?🤔
© DMM CONFIDENTAL インターフェースの メモリ割り当てについて
© DMM インターフェースのメモリ割り当て(雑) 24 • インターフェースは「型」と「値」を持っている • 「型」はメソッド情報へのポインタ • 「値」は実際のデータへのポインタ
(他の言語でのボックス化に近い概念かもしれません)
© DMM インターフェースのメモリ割り当て(雑) 25 String() メソッドを持つ構造体 A
© DMM インターフェースのメモリ割り当て(雑) 26 fmt.Stringer として新しく変数を作る
© DMM インターフェースのメモリ割り当て(雑) 27 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str
などの値 fmt.Stringer a.String()
© DMM インターフェースのメモリ割り当て(雑) 28 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str
などの値 fmt.Stringer 値へのポインタはヒー プ領域に確保 a.String()
© DMM インターフェースのメモリ割り当て(雑) 29 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str
などの値 a.String() 値へのポインタはヒー プ領域に確保 ポインタ分のヒープ領域への 割り当てが発生する!
© DMM インターフェースのメモリ割り当て(雑) 30 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str
などの値 a.String() 値へのポインタはヒー プ領域に確保 最適化で割り当てが 発生しない場合もあります
© DMM 最適化. 割り当てが発生しないこともある 31 ※ ワードサイズ: 32bit や 64bit
などのCPUの処理単位
© DMM 最適化. 割り当てが発生しないこともある 32 i := any(v) 型へのポインタ 値へのポインタ
100 any
© DMM 最適化. 割り当てが発生しないこともある 33 i := any(v) 型へのポインタ 値へのポインタ
100 any 値をここに入れた方が 効率的!
© DMM 最適化. 割り当てが発生しないこともある 34 i := any(v) 型へのポインタ 100
any ポインタのヒープ 割り当てがなくなる
© DMM つまり..? 35 • インターフェースを介すと、メモリ割り当てが発生! ◦ (大体のケースで) • 1回は小さくても頻繁に行われるなら大きく響くかも..?
© DMM CONFIDENTAL sync.Pool, sync.Map に話をもどして ...
© DMM any で扱うことのなにが問題か?(再掲) 37 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう
© DMM any で扱うことのなにが問題か?(再掲) 38 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう sync(v1)
では any で扱ってしまっている ... インターフェースを介さないジェネリクスで扱い たい!
© DMM CONFIDENTAL sync/v2 パッケージのプロポーザル
© DMM 提案の概要 • sync.Pool, sync.Map をジェネリクス対応 • (sync.NewPool() があるのでただの移行ではないが、主題はジェネリク
ス) • それ以外は据え置き 40
© DMM sync.Pool のジェネリクス対応 41
© DMM sync.Map のジェネリクス対応 42
© DMM 提案の内容(再掲) • sync.Pool, sync.Map をジェネリクス対応 • (sync.NewPool() があるのでただの移行ではないが、主題はジェネリク
ス) • それ以外は据え置き 43
© DMM 提案の内容(再掲) • sync.Pool, sync.Map をジェネリクス対応 • (sync.NewPool() があるのでただの移行ではないが、主題はジェネリク
ス) • それ以外は据え置き 44 ジェネリクス対応のためだけに v2 にするのか という意見もある
© DMM 議論の一部要約 45 ジェネリクス対応のためだけに v2にするべきか? 今後 sync/v3, net/http/v10, …
のように 乱立してしまうのでは? ジェネリクスほどの大きな変更で はじめて sync/v3 になるので乱立しない
© DMM CONFIDENTAL ジェネリクス対応と v2
© DMM ジェネリクス対応とv2 • 2021年頃から sync/v2 とは別で議論がされている 47
© DMM 検討案 48 2. XxxOf 接尾辞 3. 型パラメータ デフォルト値
1. v2パッケージ をつくる
© DMM 案1. v2パッケージをつくる • まさしく sync/v2 のようにバージョンを分ける 49
© DMM 案1. v2パッケージをつくる • まさしく sync/v2 のようにバージョンを分ける 50 sync/v3,
net/http/v10, ... のように乱立しそう
© DMM 案2. XxxOf 接尾辞 • PoolOf[T], MinOf[T] • XxxOf
でジェネリクスとする • 元々ジェネリクスなものはそのまま Tree[K, V] 51
© DMM 案2. XxxOf 接尾辞 • PoolOf[T], MinOf[T] • XxxOf
でジェネリクスとする • 元々ジェネリクスなものはそのまま Tree[K, V] 52 混乱しやすい
© DMM 案3. 型パラメータにデフォルト値 • ジェネリクス構文を拡張して互換性を保つ 53
© DMM 案3. 型パラメータにデフォルト値 • ジェネリクス構文を拡張して互換性を保つ 54 直感的でない
© DMM ジェネリクス対応とv2 • 結論は出ず... • sync/v2 パッケージでも同様の議論が生まれている • 差別化のために
x/sync の Cond をいれてみてはという意 見も 55
© DMM CONFIDENTAL 感想とまとめ
© DMM 感想とまとめ • いろんな v2 パッケージのプロポーザルがある! • sync.Pool と
sync.Map がジェネリクス対応するかも? • sync/v2 は今後のジェネリクス対応にも関わってきそうなので期 待 57
© DMM 参考 • https://github.com/golang/go/issues/71076 • https://research.swtch.com/interfaces • https://github.com/dominikh/go-tools/issues/302 •
https://go-review.googlesource.com/c/go/+/24371?tab=comments • メモリアドレス - Wikipedia 58
© DMM ご清聴ありがとうございました!