ポインタって?
まず、ポインタという言葉の前にメモリについて理解をすることが必要です。
n := 200
変数nが定義された時に、200を一時的に保存する場所が メモリ
です。
メモリは、複数存在しそれぞれのメモリに番号が振られています。
この番号を アドレス
と呼びます。
実際にアドレスを確認してみます。
Goでは、&を定義した変数の前につけることでメモリを確認することができます。
func main() {
n := 200
fmt.Println(&n)
// -> 0xc000084000
つまり、アドレス0xc000084000
に変数nの200が保存されていることになります。
アドレスとメモリについて理解したところで、ポインタ
について考えていきます。
ポインタを調べると、このようにまとめらていました。
- メモリのアドレス情報のこと
- アドレス情報を格納するための変数のこと
もう少しこの2つを詳細に見ていきます。
Golangには、 ポインタ型
とポインタ変数
ポインタ型は、stringやintなどの方に*をつけることで定義します。
下では、nがポインタ変数にあたり、*intがポインタ型になります。
func main() {
var pointer *int
n := 100
// 1.
pointer = &n
// 2.
fmt.Println("pointerの中身:", *pointer)
}
- &nを使うことで、nのアドレスの番地をpointerに格納している
- pointer型から値を取得するためには、*をつけることで値を表示することができる
実際にポインタ型を使う時
ポインタ型は、参照渡しを行う時に用います。
Swiftでは、inoutを使いますね。
func main() {
a, b := 100, 100
checker(a, &b)
fmt.Println(a, &b)
// -> 100 101
}
//1
func checker(a int, b *int) {
a++
*b++
}
- 参照渡しを行うことで、呼び出しもとのbの値が変更される。
まとめ
多言語からGolangを始める方、初心者の方はこのポインタ型におそらく苦労されると思います。(自分がそうだった)
そこで、実際に手を動かして書くことで少し理解が深まると思います!
ぜひ、この記事を読みながら実際にパソコンでも手を動かして欲しいなと思います。