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
590
Goにおけるポインタの使いどころ
uji
January 16, 2021
Tweet
Share
More Decks by uji
See All by uji
マネーフォワード ME ブロックチェーン連携機能におけるGoの活用方法
uji
1
130
Goはブロックチェーン領域でなぜ使われ、どのように活躍しているのか
uji
1
500
標準パッケージ初のgenerics利用事例 "sync/atomic.Pointer"
uji
2
480
5分で完全理解するGoのiota
uji
7
5k
GoのGC (garbage collector)について理解する
uji
10
6.1k
シンプルなモック生成ツール matryer/moq 使ってみた
uji
0
380
goroutine で panic すると親プロセスをまきこんで落ちる
uji
0
1.2k
Google Chromeで始めるVim
uji
0
150
Other Decks in Technology
See All in Technology
キャラクター制御のためのプロンプト術 for LINE Bot
uezo
0
500
〜小さく始めて大きく育てる〜データ分析基盤の開発から活用まで
kniino
0
1.8k
Algyan イベント振り返り
linyixian
0
170
Databricks:『生成AI World Cup』のご案内
databricksjapan
1
120
Databricksを活用してDELISH KITCHENのレシピレコメンドを開発した話
furu8
0
240
AWS パートナー企業でテクニカルサポートに従事して2年経ったので思うところをまとめてみた
kazzpapa3
3
1.3k
o11y入門_外形監視を利用したWebアプリケーションへの最適なモニタリング_TechBrew
k5k
2
100
メールセキュリティの DMARC周りの設定を少しずつ設定してみたお話
miu_crescent
1
260
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
1
630
自動生成を活用した、運用保守コストを抑える Error/Alert/Runbook の一元集約管理 / Centralized management of Error/Alert/Runbook to minimize operational costs using automated code generation
biwashi
9
2k
反実仮想機械学習とは何か
usaito
PRO
6
970
入社後初めてのタスクでk8sアップグレードした話.pdf
kkato1
0
370
Featured
See All Featured
Pencils Down: Stop Designing & Start Developing
hursman
115
11k
Automating Front-end Workflow
addyosmani
1354
200k
Fireside Chat
paigeccino
19
2.6k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
The Art of Programming - Codeland 2020
erikaheidi
41
12k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
39
4.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
29
6k
Scaling GitHub
holman
457
140k
A better future with KSS
kneath
230
16k
jQuery: Nuts, Bolts and Bling
dougneiner
58
7.1k
Creatively Recalculating Your Daily Design Routine
revolveconf
209
11k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
24
2.3k
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