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
990
Goにおけるポインタの使いどころ
uji
January 16, 2021
Tweet
Share
More Decks by uji
See All by uji
Go標準の暗号ライブラリメンテナンス戦略
uji
3
570
NOT A HOTEL TECH TALK ーSOFTWARE 3.0への道筋ー NEXT Web3 (2024-08-07)
uji
0
140
マネーフォワード ME ブロックチェーン連携機能におけるGoの活用方法
uji
1
210
Goはブロックチェーン領域でなぜ使われ、どのように活躍しているのか
uji
1
690
標準パッケージ初のgenerics利用事例 "sync/atomic.Pointer"
uji
2
820
5分で完全理解するGoのiota
uji
11
6.9k
GoのGC (garbage collector)について理解する
uji
11
7.4k
シンプルなモック生成ツール matryer/moq 使ってみた
uji
0
590
goroutine で panic すると親プロセスをまきこんで落ちる
uji
0
2k
Other Decks in Technology
See All in Technology
他チームへ越境したら、生データ提供ソリューションのクエリ費用95%削減へ繋がった話 / Cross-Team Impact: 95% Off Raw Data Query Costs
yamamotoyuta
0
170
KMP導⼊において、マネジャーとして考えた事
sansantech
PRO
1
180
Machine Intelligence for Vision, Language, and Actions
keio_smilab
PRO
0
390
オープンソースのハードウェアのコンテストに参加している話
iotengineer22
0
340
Oracle Database オプティマイザ・ヒントの活用
oracle4engineer
PRO
1
130
人とAIとの共創を夢見た2か月 #共創AIミートアップ / Co-Creation with Keito-chan
kondoyuko
1
620
AIに実況させる / AI Streamer
motemen
3
1.3k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
12k
ローカル環境でAIを動かそう!
falken
PRO
1
140
Oracle Cloud Infrastructure:2025年5月度サービス・アップデート
oracle4engineer
PRO
0
300
AIの電力問題を概観する
rmaruy
1
200
GitHub Coding Agent 概要
kkamegawa
1
1.1k
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
53
11k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.2k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Mobile First: as difficult as doing things right
swwweet
223
9.6k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
Reflections from 52 weeks, 52 projects
jeffersonlam
349
20k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
How GitHub (no longer) Works
holman
314
140k
Done Done
chrislema
184
16k
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