Golangにおけるポインタについて

これまで、Swiftをメインに書いてきましたが、最近golangを触る機会がありました。 Swiftでは考える機会がなかった ポインタメモリ についてまとめていきます。

初心者の方にわかりやすく伝わればいいなと思っています。

ポインタって?

まず、ポインタという言葉の前にメモリについて理解をすることが必要です。

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)
}
  1. &nを使うことで、nのアドレスの番地をpointerに格納している
  2. 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++

}
  1. 参照渡しを行うことで、呼び出しもとのbの値が変更される。

まとめ

多言語からGolangを始める方、初心者の方はこのポインタ型におそらく苦労されると思います。(自分がそうだった)

そこで、実際に手を動かして書くことで少し理解が深まると思います!

ぜひ、この記事を読みながら実際にパソコンでも手を動かして欲しいなと思います。