Slide 1

Slide 1 text

Goにおける
 ポインタの使いどころ
 uji @uji_rb


Slide 2

Slide 2 text

ポインタの使い分け、上手くできてますか?
 ポインタによる変数の受け渡しは、値をコピーする必要がなくアドレスを渡すだけで完了 するので効率的
 
 しかし、Goにはガベージコレクションがある
 
 ポインタを使いすぎるとガベージコレクションの負荷が高くなり、多くのCPU時間を消費す るようになる可能性


Slide 3

Slide 3 text

この struct を
 値渡しする関数 
 ポインタ渡しする関数
 ベンチマークをとって比較すると
 ポインタ渡しの方が消費CPU時間が多い


Slide 4

Slide 4 text

どのような場面でポインタは使われるべき?


Slide 5

Slide 5 text

引数やレシーバを関数内で書き換える必要がある場合
 逆に変更を加えない関数は、値レシーバを使っ た方が
 「この関数はレシーバに変更を加えない」
 というのがシグネシャだけで明示的にできる


Slide 6

Slide 6 text

コピーを避けたいデータを引数、レシーバにする場合
 例: os.File, sync.Mutex


Slide 7

Slide 7 text

大きな構造体や配列を扱う場合
 フィールドが多い構造体や、要素が多い配列はGCの負荷より値コピーの方のコストが 課題になる場合が出てくる
 
 利便性や変更容易性、GCの負荷等を考慮して決める
 
 迷ったらポインタを使う (Go Code Review Comments)


Slide 8

Slide 8 text

大きな構造体をスライスに持たせる場合
 スライス は cap 以上に append した際や、for ~ range でsliceの要素を取得する際に、 全レコードのコピーが発生する
 
 
 
 
 ポインタにしておくとコピーのコストが抑えられる


Slide 9

Slide 9 text

まとめ
 以下の場面ではポインタの利用を検討する
 
 ● 引数やレシーバを関数内で書き換える必要がある場合
 ● コピーを避けたいデータを引数、レシーバにする場合
 ● 大きな構造体や配列を扱う場合
 ● 大きな構造体をスライスに持たせる場合


Slide 10

Slide 10 text

参考
 
 
 
 zenn の記事にのせてます
 
 https://zenn.dev/uji/articles/f6ab9a06320294146733