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
760
Goにおけるポインタの使いどころ
uji
January 16, 2021
Tweet
Share
More Decks by uji
See All by uji
NOT A HOTEL TECH TALK ーSOFTWARE 3.0への道筋ー NEXT Web3 (2024-08-07)
uji
0
84
マネーフォワード ME ブロックチェーン連携機能におけるGoの活用方法
uji
1
170
Goはブロックチェーン領域でなぜ使われ、どのように活躍しているのか
uji
1
580
標準パッケージ初のgenerics利用事例 "sync/atomic.Pointer"
uji
2
620
5分で完全理解するGoのiota
uji
10
5.8k
GoのGC (garbage collector)について理解する
uji
10
6.6k
シンプルなモック生成ツール matryer/moq 使ってみた
uji
0
470
goroutine で panic すると親プロセスをまきこんで落ちる
uji
0
1.6k
Google Chromeで始めるVim
uji
0
180
Other Decks in Technology
See All in Technology
Envoy External AuthZとgRPC Extensionを利用した「頑張らない」Microservices認証認可基盤
andoshin11
0
250
OCI で始める!! Red Hat OpenShift / Get Started OpenShift on OCI
oracle4engineer
PRO
1
180
技術的負債解消の取り組みと専門チームのお話
bengo4com
0
330
Technical Writing Meetup vol.35
soracom
PRO
2
120
【株式会社ELYZA】|GENIAC成果報告会 自社開発モデルプレゼンテーション
elyza
1
270
React Aria で実現する次世代のアクセシビリティ
ryo_manba
4
1.2k
事前準備が肝!AI活用のための業務改革
layerx
PRO
1
380
Functional TypeScript
naoya
11
4.8k
GC24 Recap: Interface Internals
task4233
0
140
Cloud Run と GitHub Template Repository による軽量なアプリケーションプラットフォーム/ #nikkei_tech_talk
nikkei_engineer_recruiting
0
110
持続可能なソフトウェア開発を支える『GitHub CI/CD実践ガイド』
tmknom
7
1.4k
Jetpack Compose Modifier 徹底解説 / Jetpack Compose Modifier
wiroha
0
200
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
425
64k
Clear Off the Table
cherdarchuk
91
320k
YesSQL, Process and Tooling at Scale
rocio
167
14k
GraphQLとの向き合い方2022年版
quramy
43
13k
Building Applications with DynamoDB
mza
90
6k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
23
1.7k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
45
4.8k
GraphQLの誤解/rethinking-graphql
sonatard
65
9.8k
Code Reviewing Like a Champion
maltzj
517
39k
Debugging Ruby Performance
tmm1
72
12k
Embracing the Ebb and Flow
colly
83
4.4k
We Have a Design System, Now What?
morganepeng
48
7.1k
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