サンプルで学ぶ Go 言語:Pointers

Go はポインタをサポートしている。 ポインタを使うと、プログラム中で値やレコードへの参照を渡すことができる。

package main
import "fmt"

ここではポインタと値の振る舞いの違いを、zerovalzeroptr の2つの関数を使って見てもらう。 zerovalint 型の引数を取るので、引数は値として渡される。 zerovalival のコピーを渡されるが、この実体は関数を呼び出す側で引数に渡した変数とは別のものである。

func zeroval(ival int) {
    ival = 0
}

一方、zeroptr の引数の型は *int である。 すなわち、引数は int 型のポインタとして渡される。 関数の中の *iptr と書いた箇所では、ポインタの参照を剥がしている。 これは、メモリ上のアドレスから、その番地にある現在の値にアクセスする操作だ。 剥がされたポインタに値を代入すると、ポインタが参照していたアドレスに書かれた値が書き換わる。

func zeroptr(iptr *int) {
    *iptr = 0
}
func main() {
    i := 1
    fmt.Println("initial:", i)
    zeroval(i)
    fmt.Println("zeroval:", i)

&i という記法で、i のメモリアドレスを取得できる。 このメモリアドレスは、i のポインタである。

    zeroptr(&i)
    fmt.Println("zeroptr:", i)

ポインタも表示できる。

    fmt.Println("pointer:", &i)
}

zerovalmaini を書き換えないが、 zeroptri を書き換える。 これは後者には変数のメモリアドレスへの参照を渡しているからである。

$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100

次の例:Structs