虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Go言語のポインタ
2018.12.12 オタクが最新技術を追うライトニングトークイベント
株式会社虎の穴 開発室
M.U
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
今回話すこと
1. はじめに
2. Go言語のポインタ変数の宣言と参照
3. Go言語の値渡しと参照渡し
4. まとめ
2
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
M.U
• 2017年5月虎の穴入社
• Fantiaの運用/開発
  主に使う言語
Ruby, JavaScript
Java, Kotlin
    Go(最近…)
3
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
はじめに
• 対象者はこれからGo始める中でポインタに慣れ
ていない方(Go言語を最近はじめた方)
• Go言語で開発するにはポインタは避けて通れな
い。
4
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
質問①
Go言語を
「勉強したい」or「最近始めた」
5
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
質問②
Go言語触ってみて
ポインタってやっぱり分からない
6
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴 Go言語でのポインタ
結果
①
②
③
④
7
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴 Go言語でのポインタ
結果
8
普通の変数に&をつける
普通の変数のアドレスが見える
ポインター変数に*をつける
普通の変数みたいに値が見える
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴 配列のポインタ
配列毎のアドレスを見る
結果
9
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
ポインタを使うところってどこ?
10
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴 関数の値渡し
引数は値渡し
関数内でインクリメント
結果
11
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴 値渡しは変数をコピーしている
main関数
age = 20
int型変数
birthday関数
age = 20
int型変数
age = 21
値(20)を代入している
関数内の値が21になっただけ
12
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
関数のポインタ渡し
引数はポインタ型
*をつけて値をインクリメント
値ではなくアドレスを渡す 結果
13
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴 関数の引数にアドレス値を渡している
main関数
age = 20
int型変数
birthday関数
0xc000012345
ポインタ変数
age = 21
アドレスを代入
アドレスが指し示す値をインクリメント
0xc000012345
14
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
おまけ
Dockerのソースコードの一部を覗いてみる!
dockerコマンドのmainパッケージ
https://github.com/docker/docker-ce/blob/master/compone
nts/cli/cmd/docker/docker.go
15
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
まとめ
• Go言語でのポインタの操作方法
• ポインターも変数の一種
• 大きな構造体や配列を扱う場合は参照渡し
• DBのアクセスやネットワーク接続にはパッケージを利
用する場合が多い
– パッケージの活用はポインタの理解が不可欠。
16

Go言語のポインタ