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
1.1k
Goにおけるポインタの使いどころ
uji
January 16, 2021
Tweet
Share
More Decks by uji
See All by uji
Green Tea GCの動作を紙芝居にしてみる
uji
1
54
Go Proverbs の紹介
uji
2
130
Go標準の暗号ライブラリメンテナンス戦略
uji
3
620
NOT A HOTEL TECH TALK ーSOFTWARE 3.0への道筋ー NEXT Web3 (2024-08-07)
uji
0
170
マネーフォワード ME ブロックチェーン連携機能におけるGoの活用方法
uji
1
230
Goはブロックチェーン領域でなぜ使われ、どのように活躍しているのか
uji
1
730
標準パッケージ初のgenerics利用事例 "sync/atomic.Pointer"
uji
2
890
5分で完全理解するGoのiota
uji
11
7.2k
GoのGC (garbage collector)について理解する
uji
11
7.7k
Other Decks in Technology
See All in Technology
AI時代を生き抜くエンジニアキャリアの築き方 (AI-Native 時代、エンジニアという道は 「最大の挑戦の場」となる) / Building an Engineering Career to Thrive in the Age of AI (In the AI-Native Era, the Path of Engineering Becomes the Ultimate Arena of Challenge)
jeongjaesoon
0
180
2025年夏 コーディングエージェントを統べる者
nwiizo
0
170
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
420
CDK CLIで使ってたあの機能、CDK Toolkit Libraryではどうやるの?
smt7174
4
190
BPaaSにおける人と協働する前提のAIエージェント-AWS登壇資料
kentarofujii
0
140
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
9
73k
AI開発ツールCreateがAnythingになったよ
tendasato
0
130
Generative AI Japan 第一回生成AI実践研究会「AI駆動開発の現在地──ブレイクスルーの鍵を握るのはデータ領域」
shisyu_gaku
0
280
EncryptedSharedPreferences が deprecated になっちゃった!どうしよう! / Oh no! EncryptedSharedPreferences has been deprecated! What should I do?
yanzm
0
390
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
8.7k
「Linux」という言葉が指すもの
sat
PRO
4
140
これでもう迷わない!Jetpack Composeの書き方実践ガイド
zozotech
PRO
0
880
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
A Tale of Four Properties
chriscoyier
160
23k
Documentation Writing (for coders)
carmenintech
74
5k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Designing Experiences People Love
moore
142
24k
Visualization
eitanlees
148
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