ここ数日、いろいろと挙動を確認しながらGolangのポインタを勉強しています。
ブログや本などを色々読み漁っていましたが、アドレス演算子を触っいる時、少ししっくりきた部分があったので備忘録として残しておこうと思います。
基礎中の基礎で、かなりシンプルな内容です。
アドレス演算子
アドレス演算子とは、変数の格納アドレスを確認することができる演算子です。
var i int
i = 5
fmt.Println(i) // => 5
fmt.Println(&i) // => 0xc000014078
&i
で出力すると変数 i の格納アドレスのみが出力されました。
&を付けると格納アドレスだけ表示されます。
次はpに代入
var i int
i = 5
p := &i
fmt.Println(p) // => 0xc000014078
当たり前のようですが、 変数p
も格納アドレスだけ寄越してきました。
これは格納アドレスをp
に渡しているから、こう表現されるのでしょう。
それぞれの変数の中身(型、アドレス)がどうなっているのか確認してみました
var i int
i = 5
p := &i
fmt.Printf("type=%T, address=%p, int=%d\n", i, i)
// => type=int, address=%!p(int=5)
fmt.Printf("type=%T, address=%p, int=%d\n", &i, &i)
// => type=*int, address=0xc000098000
fmt.Printf("type=%T, address=%p, int=%d\n", p, p)
// => type=*int, address=0xc000098000
アドレス演算子&
を付けると型も特殊な*int型になります。
型が違うのでint型と*int型は計算はできません。
var i int
i = 5
p := &i
q := p + 5
// invalid operation: p + 5 (mismatched types *int and int)
肝心のpの値を利用したいときには変数に*
を付けます
var i int
i = 5
p := &i
fmt.Println(*p) // => 5
処理を行うときにも忘れずに。
var i int
i = 5
p := &i
q := *p + 5
fmt.Println(q) // => 10
ポインタはGo言語で重要な概念で、構造体を利用する際に必ず利用します。
構造体は他言語でいうクラスみたいなものですが、値型と参照型と言う点で性質が違います。