Goを使用するにあたり、ポインタとアドレスでつまづいたので覚書


Goでは値が初期化(定義)されると、値の内容の他にその値がメモリ上のどこにあるかを示すアドレスというパラメータが自動生成される。

アドレスの仕組み

アドレスを確認する場合

&value

というように、「&+値名」のように書くと、その値のアドレスを参照できる。

例1
func main() {
    a := 5
    b := &a 

    fmt.Println(a)
    fmt.Println(&a)
    fmt.Println(b)
    fmt.Println(&b)
}
結果
5
0xc00001a060
0xc00001a060
0xc00000e028

これは何が起こっているのかというと、aにbのアドレスを代入したので、fmt.Println(b)の戻り値はfmt.Println(&a)の戻り値となる。
また、bは新しく定義されたので、bには値としてaのアドレスがセットされたと同時に、bにはアドレスが割り振られた。

アドレスに値があれば、アドレスから値を参照することができる

(例1)では、bにはaのアドレスを代入したが、その前にaには値が定義されているので、bからaにセットされている値を参照することができる。

アドレスに値がセットされている場合、

*value

のように、「* + 値名」で参照することができる。

例2
func main() {
    a := 5
    b := &a

    fmt.Println(*b)
}
結果
5

アドレスの中の値を変えることもできる。

例3
func main() {
    a := 5
    b := &a
    *b = 8

    fmt.Println(a)
    fmt.Println(*b)
}
結果
8
8

bにaのアドレスを代入したのちに、bに割り振られているアドレスにセットされている値(5)を8にしたので、また、bとaはアドレスが同じなので、自動的にaの値も変わる。