Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

9c23bec5e8b0aa1d9458d40800987347?s=47 uji
January 16, 2021

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

9c23bec5e8b0aa1d9458d40800987347?s=128

uji

January 16, 2021
Tweet

Transcript

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


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


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


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


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


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


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

    Comments)

  8. 大きな構造体をスライスに持たせる場合
 スライス は cap 以上に append した際や、for ~ range でsliceの要素を取得する際に、

    全レコードのコピーが発生する
 
 
 
 
 ポインタにしておくとコピーのコストが抑えられる

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

    大きな構造体をスライスに持たせる場合

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