5分でわかる
Goのポインタ
ポインタとは?
用語
• & と *
•&(アンパサンド)はアドレス演算子
•*(アスタリスク)は間接参照演算子
ポインタとは?
• C/C++でメモリアドレスを表すための、いわゆる”ポインタ”
https://wandbox.org/permlink/Ot9bVGoiwNUec6ab
ポインタとは?
• GoではC/C++の記法を踏襲し、 *演算子 と &演算子 を使う
https://wandbox.org/permlink/pnR1upjDNCxh0AiC
いつポインタを使うべきか?
用語
• 〜渡し
• ポインタで変数を渡すときは”ポインタ渡し”
• そのままのときは”値渡し”
いつポインタを使うべきか?
• 既存のコード/外部ライブラリの関数が引数にポインタ型を取る場合
• 怖くても使わざるを得ない…😭
• 使っていくうちに慣れてパターンがわかってくる👍
いつポインタを使うべきか?
• 既存のコード/外部ライブラリの関数が引数にポインタ型を取る場合
• 恐らく次の場合のいずれかに該当する
いつポインタを使うべきか?
• 大きいstruct, array
• なぜなら値渡しだとコピーするコストが大きいから
いつポインタを使うべきか?
• ある構造体について、変数として渡した先で変更を加えたい場合
https://wandbox.org/permlink/7tPKd1tFE950LW2y
いつポインタを使うべきか?
• その他、メモリコピー量を低減できるようなケース
• 例えばsliceの場合、sort.Slice()のような関数でソートするときに、要素を並べ
替える必要があるため、ポインタとして扱ったほうがいい
https://golang.org/pkg/sort/#Slice
https://wandbox.org/permlink/4fQFCwf1jXLGMjFX
https://wandbox.org/permlink/k9E2L5nKyWrKq72d
再掲:
ポインタを使うべきでない場合
ポインタを使うべきでない場合
• プリミティブな値
• int, bool, stringなど
ポインタを使うべきでない場合
• そもそもポインタのような値
• slice, map, chan, func など
例外
• プリミティブな型だけどnilを許容したい
• C#でいうところのint?のような (参考: null許容型)
https://wandbox.org/permlink/BakTwv9IKhOtDyUs
例外
• レシーバ
• var a A について
• 🆗 a.f0()
• ❌ a.f1() // コンパイルエラー
• var p &A について
• 🆗 p.f0()
• 🆗 p.f1()
• ただし、pがnilの場合
• ❌ p.f0() // ランタイムエラー😇
• ❌ p.f1() // (pに関数内で触れたタイミングで)ランタイムエラー😇
https://wandbox.org/permlink/kEMNLHbjfr9x3ye8

5分でわかるGoのポインタ