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

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

uji
January 16, 2021

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

uji

January 16, 2021
Tweet

More Decks by uji

Other Decks in Technology

Transcript

  1. Goにおける

    ポインタの使いどころ

    uji @uji_rb


    View full-size slide

  2. ポインタの使い分け、上手くできてますか?

    ポインタによる変数の受け渡しは、値をコピーする必要がなくアドレスを渡すだけで完了
    するので効率的


    しかし、Goにはガベージコレクションがある


    ポインタを使いすぎるとガベージコレクションの負荷が高くなり、多くのCPU時間を消費す
    るようになる可能性


    View full-size slide

  3. この struct を

    値渡しする関数 
 ポインタ渡しする関数

    ベンチマークをとって比較すると

    ポインタ渡しの方が消費CPU時間が多い


    View full-size slide

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


    View full-size slide

  5. 引数やレシーバを関数内で書き換える必要がある場合

    逆に変更を加えない関数は、値レシーバを使っ
    た方が

    「この関数はレシーバに変更を加えない」

    というのがシグネシャだけで明示的にできる


    View full-size slide

  6. コピーを避けたいデータを引数、レシーバにする場合

    例: os.File, sync.Mutex


    View full-size slide

  7. 大きな構造体や配列を扱う場合

    フィールドが多い構造体や、要素が多い配列はGCの負荷より値コピーの方のコストが
    課題になる場合が出てくる


    利便性や変更容易性、GCの負荷等を考慮して決める


    迷ったらポインタを使う (Go Code Review Comments)


    View full-size slide

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

    スライス は cap 以上に append した際や、for ~ range でsliceの要素を取得する際に、
    全レコードのコピーが発生する





    ポインタにしておくとコピーのコストが抑えられる


    View full-size slide

  9. まとめ

    以下の場面ではポインタの利用を検討する


    ● 引数やレシーバを関数内で書き換える必要がある場合

    ● コピーを避けたいデータを引数、レシーバにする場合

    ● 大きな構造体や配列を扱う場合

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


    View full-size slide

  10. 参考




    zenn の記事にのせてます


    https://zenn.dev/uji/articles/f6ab9a06320294146733


    View full-size slide