Skip to Content

Go ポインタの初歩

概要

ポインタと聞いただけで避けてきた部分があるので初歩から振り返る
書籍 入門GoプログラミングのLESSON 26を復習

&と*記号

& について

アドレス演算子(&)は、その値の メモリアドレス を示す

テストコード

変数children&をつけて表示

1
2
3
	var children string = "Asuka"

	fmt.Println(&children) // &付き
実行結果

メモリアドレスが表示される

0xc0000101e0

* について

メモリアドレスで 参照される値 を求める
&の反対で デリファレンス(逆参照) と呼ばれる

テストコード
1
2
3
4
5
	var children string = "Asuka"

	childrenAddress := &children
	fmt.Println(childrenAddress) // そのまま
	fmt.Println(*childrenAddress) // *付き
実行結果

そのままだと、そのままだからメモリアドレスが表示される
*付けた方はメモリアドレスにある値を参照したのでAsukaが表示される

0xc0000101e0
Asuka

補足

*&childrenとやると…

1
2
3
4
	var children string = "Asuka"

	fmt.Println(&children) // &についてのテストコードと同じ
	fmt.Println(*&children) // 更に*もつけた
実行結果

*&でもデリファレンスされる

0xc0000101e0
Asuka

ポイントの型

stringで定義したchildrenのメモリアドレスを格納したchildrenAddressを探る
型の前に*のついた型になる

テストコード

childrenAddressの型を表示する

1
2
3
4
5
	var children string = "Asuka"

	childrenAddress := &children
	fmt.Printf("型は %T", childrenAddress)
}

実行結果

*stringというstringの前に*がついたポインタ型

型は *string

*の紛らわしいところ

変数 の前に*をつけると、メモリアドレスにある値を参照する
アドレス番地ではない値が表示される

の前に*をつけると、ポイント型でメモリアドレスが入る
アドレス番地が表示される(nilの場合もある)

感想

最初はポインタと聞いただけで恐れていたけど、使ってるうちに感覚でわかるようになってた
深く理解していないだけど…

参考

入門Goプログラミング