Slide 1

Slide 1 text

uniqueパッケージの内部実装を 支えるweak pointerの話 Go Conference 2025 @magavel / SODA inc.

Slide 2

Slide 2 text

自己紹介 ● magavel ● 株式会社SODA (2022/11〜) ● 大阪からやってきました ● 普段はGoでSNKRDUNKを開発 しています

Slide 3

Slide 3 text

アジェンダ 1. weak pointerとは 2. なぜGoに導入されたのか? 3. uniqueパッケージを覗いてみる 4. まとめ

Slide 4

Slide 4 text

アジェンダ 1. weak pointerとは 2. なぜGoに導入されたのか? 3. uniqueパッケージを覗いてみる 4. まとめ

Slide 5

Slide 5 text

weak pointerとは ● オブジェクトを参照するが、そのオブジェクトのGCを妨 げないポインタ ● Go1.23でinternal/weakパッケージとして内部実装され、 Go1.24でweakパッケージとして公開された ● weak reference(弱参照)とも呼ばれる

Slide 6

Slide 6 text

weak pointerとは ● オブジェクトを参照するが、そのオブジェクトのGCを妨 げないポインタ ● Go1.23でinternal/weakパッケージとして内部実装され、 Go1.24でweakパッケージとして公開された ● weak reference(弱参照)とも呼ばれる どういうこと?

Slide 7

Slide 7 text

理解するには、 GCの基本を知っておく必要がある

Slide 8

Slide 8 text

GC(ガベージコレクション)のおさらい ● プログラムが動的に確保したメモリから不要になった データを検出してメモリを解放する仕組み ● メモリにはスタック領域とヒープ領域があり、GCが管理 しているのは後者 ● Goでは、ルートオブジェクト(スタック領域の値・グロー バル変数など)から到達可能かどうかでGCするか判断する

Slide 9

Slide 9 text

weakパッケージ概要

Slide 10

Slide 10 text

もう少し解像度を上げて見てみる

Slide 11

Slide 11 text

図解すると

Slide 12

Slide 12 text

図解すると

Slide 13

Slide 13 text

図解すると

Slide 14

Slide 14 text

weak pointerは参照している オブジェクトのGCを妨げない

Slide 15

Slide 15 text

アジェンダ 1. weak pointerとは 2. なぜGoに導入されたのか? 3. uniqueパッケージを覗いてみる 4. まとめ

Slide 16

Slide 16 text

アジェンダ 1. weak pointerとは 2. なぜGoに導入されたのか? 3. uniqueパッケージを覗いてみる 4. まとめ

Slide 17

Slide 17 text

なぜGoに導入されたのか? もともと他言語(JavaやC#など)にもある仕組みなので、 Goにおいても当初から議論はされていた。 ref: https://groups.google.com/g/golang-nuts/c/9br5GgucQcU ref: https://groups.google.com/g/golang-nuts/c/PYWxjT2v6ps

Slide 18

Slide 18 text

導入のきっかけは、uniqueパッケージ

Slide 19

Slide 19 text

uniqueパッケージによって必要性が明らかに ● uniqueパッケージは値のinterningを実現するもの。 ● もともとGoはinterningに関するruntime側のサポートが弱かった。 ● go4.org/internというコミュニティ実装に頼っていたけど、Finalizerやuintptrを 使ってGCに追跡されない形でポインタを保持したり、安全ではないという問題を 抱えていた(Goのアップデート毎に手動更新が必要などの問題もあった)。 ● interningのサポートを求めるコミュニティの声はマイノリティだけど、net/netip の前身であるinetaf/netaddrの内部で使用されていて、実は多くの人(Go modules 全体の0.1%と想定)がそのリスクに依存している状態だとわかった。 ● ならちゃんとruntime側のサポートも追加してしっかり実装しよう。 ○ それがuniqueパッケージの提案。 ● さらにuniqueパッケージの内部で使われるweak pointerのニッチだけど汎用的な価 値が認知される。

Slide 20

Slide 20 text

そしてプロポーザルが生まれる

Slide 21

Slide 21 text

アジェンダ 1. weak pointerとは 2. なぜGoに導入されたのか? 3. uniqueパッケージを覗いてみる 4. まとめ

Slide 22

Slide 22 text

アジェンダ 1. weak pointerとは 2. なぜGoに導入されたのか? 3. uniqueパッケージを覗いてみる 4. まとめ

Slide 23

Slide 23 text

canonMapへのentry追加処理

Slide 24

Slide 24 text

アジェンダ 1. weak pointerとは 2. なぜGoに導入されたのか? 3. uniqueパッケージを覗いてみる 4. まとめ

Slide 25

Slide 25 text

アジェンダ 1. weak pointerとは 2. なぜGoに導入されたのか? 3. uniqueパッケージを覗いてみる 4. まとめ

Slide 26

Slide 26 text

まとめ ● weak pointerはオブジェクトのGCを妨げないポインタ ● uniqueパッケージがきっかけで導入された ● 使い所としてinterningやメモリ効率なキャッシュなど

Slide 27

Slide 27 text

まとめ ● weak pointerはオブジェクトのGCを妨げないポインタ ● その概念を理解するにはGCの基礎知識が必要 ● uniqueパッケージがきっかけで導入された もっと知りたいときのキーワード ● Indirection Objectの存在理由 ● 短い弱参照と長い弱参照の話 ● AddCleanupとFinalizer etc…

Slide 28

Slide 28 text

参考文献・クレジット ● Go 1.24 Release Notes ● Issue #67552: "weak: new package providing weak pointers" ● weak references - golang-nuts ● From unique to cleanups and weak: new low-level tools for efficiency - The Go Blog ● weak package - pkg.go.dev ● Weak & Soft references in Go - golang-nuts ● Issue #62483: "unique: new package with unique.Handle" ● The Go gopher was designed by Renée French.

Slide 29

Slide 29 text

おまけ 今回のGo Conference 2025のために ブラウザゲームを作りました。 Created by repo: https://github.com/snkrdunk/find-gopher

Slide 30

Slide 30 text

Thank you. ご清聴ありがとうございました!