Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goにおけるポインタの使いどころ
Search
uji
January 16, 2021
Technology
0
900
Goにおけるポインタの使いどころ
uji
January 16, 2021
Tweet
Share
More Decks by uji
See All by uji
Go標準の暗号ライブラリメンテナンス戦略
uji
3
500
NOT A HOTEL TECH TALK ーSOFTWARE 3.0への道筋ー NEXT Web3 (2024-08-07)
uji
0
130
マネーフォワード ME ブロックチェーン連携機能におけるGoの活用方法
uji
1
190
Goはブロックチェーン領域でなぜ使われ、どのように活躍しているのか
uji
1
650
標準パッケージ初のgenerics利用事例 "sync/atomic.Pointer"
uji
2
760
5分で完全理解するGoのiota
uji
11
6.5k
GoのGC (garbage collector)について理解する
uji
10
7.1k
シンプルなモック生成ツール matryer/moq 使ってみた
uji
0
550
goroutine で panic すると親プロセスをまきこんで落ちる
uji
0
1.8k
Other Decks in Technology
See All in Technology
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.8k
サバイバルモード下でのエンジニアリングマネジメント
konifar
21
7.1k
フォーイット_エンジニア向け会社紹介資料_Forit_Company_Profile.pdf
forit_tech
1
1.7k
Two Blades, One Journey: Engineering While Managing
ohbarye
4
2.6k
Apache Iceberg Case Study in LY Corporation
lycorptech_jp
PRO
0
380
クラウド関連のインシデントケースを収集して見えてきたもの
lhazy
9
1.9k
2/18 Making Security Scale: メルカリが考えるセキュリティ戦略 - Coincheck x LayerX x Mercari
jsonf
0
250
アジリティを高めるテストマネジメント #QiitaQualityForward
makky_tyuyan
1
270
JAWS FESTA 2024「バスロケ」GPS×サーバーレスの開発と運用の舞台裏/jawsfesta2024-bus-gps-serverless
ma2shita
3
340
Snowflake ML モデルを dbt データパイプラインに組み込む
estie
0
110
AI Agent時代なのでAWSのLLMs.txtが欲しい!
watany
3
370
プロダクト開発者目線での Entra ID 活用
sansantech
PRO
0
120
Featured
See All Featured
Adopting Sorbet at Scale
ufuk
75
9.2k
Agile that works and the tools we love
rasmusluckow
328
21k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Being A Developer After 40
akosma
89
590k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
A Philosophy of Restraint
colly
203
16k
Designing for Performance
lara
605
68k
Mobile First: as difficult as doing things right
swwweet
223
9.5k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
260
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
Producing Creativity
orderedlist
PRO
344
40k
Transcript
Goにおける ポインタの使いどころ uji @uji_rb
ポインタの使い分け、上手くできてますか? ポインタによる変数の受け渡しは、値をコピーする必要がなくアドレスを渡すだけで完了 するので効率的 しかし、Goにはガベージコレクションがある ポインタを使いすぎるとガベージコレクションの負荷が高くなり、多くのCPU時間を消費す るようになる可能性
この struct を 値渡しする関数 ポインタ渡しする関数 ベンチマークをとって比較すると ポインタ渡しの方が消費CPU時間が多い
どのような場面でポインタは使われるべき?
引数やレシーバを関数内で書き換える必要がある場合 逆に変更を加えない関数は、値レシーバを使っ た方が 「この関数はレシーバに変更を加えない」 というのがシグネシャだけで明示的にできる
コピーを避けたいデータを引数、レシーバにする場合 例: os.File, sync.Mutex
大きな構造体や配列を扱う場合 フィールドが多い構造体や、要素が多い配列はGCの負荷より値コピーの方のコストが 課題になる場合が出てくる 利便性や変更容易性、GCの負荷等を考慮して決める 迷ったらポインタを使う (Go Code Review
Comments)
大きな構造体をスライスに持たせる場合 スライス は cap 以上に append した際や、for ~ range でsliceの要素を取得する際に、
全レコードのコピーが発生する ポインタにしておくとコピーのコストが抑えられる
まとめ 以下の場面ではポインタの利用を検討する • 引数やレシーバを関数内で書き換える必要がある場合 • コピーを避けたいデータを引数、レシーバにする場合 • 大きな構造体や配列を扱う場合 •
大きな構造体をスライスに持たせる場合
参考 zenn の記事にのせてます https://zenn.dev/uji/articles/f6ab9a06320294146733