💭
Go言語でポインターを使う
Go by Example: Pointers
公式を翻訳してます
Goはポインターをサポートしており、プログラム内で値やレコードへの参照を渡すことができます。
zerovalはintパラメータを持つので、引数はvalueで渡される。zerovalは呼び出し関数内のものとは異なるivalのコピーを取得する。
対照的にzeroptrはintパラメータを持ち、つまりintポインタを受け取る。関数本体のiptrコードは、ポインタのメモリアドレスからそのアドレスの現在の値への参照を解除します。参照解除されたポインタに値を代入すると、参照されたアドレスの値が変更されます。
i構文はiのメモリーアドレス、つまりiへのポインターを与える。
ポインターも印刷できる。
zerovalはmainのiを変更しないが、zeroptrはその変数のメモリー・アドレスへの参照を持っているので変更する。
package main
import "fmt"
// zeroval関数は、ivalの引数をコピーしているため、
// main関数のivalの値は変化しない
func zeroval(ival int) {
ival = 0
}
// zeroptr関数は、*int型の引数を受け取る
// *int型は、int型のポインタを表す
func zeroptr(iptr *int) {
*iptr = 0
}
func main() {
// iはint型の変数
i := 1
// &iはiのメモリアドレスを表す
fmt.Println("initial:", i)
// zeroval関数は、iの値をコピーしているため、
// main関数のiの値は変化しない
zeroval(i)
// zeroptr関数は、iのメモリアドレスを受け取っているため、
// main関数のiの値は変化する
fmt.Println("zeroval:", i)
// &iはiのメモリアドレスを表す
zeroptr(&i)
// zeroptr関数は、iのメモリアドレスを受け取っているため、
// main関数のiの値は変化する
fmt.Println("zeroptr:", i)
// iのメモリアドレスを表す
fmt.Println("pointer:", &i)
}
実行結果
hashimotojunichi@hashimotojunichinoMacBook-Pro go-example % go run hello.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0xc0000ac008
まとめ
ポインターとは何かというと、変数のメモリ上のアドレスを格納するためのデータ型。ポインターは、その変数のメモリアドレスを示すために使用される。
アドレスは、通常16進数で表現されるらしいが、アドレス自体は16進数ではないそうです。メモリ上の特定の場所を識別するための数値だそうです。
変数のメモリのアドレスを取得するには、Go言語だとアドレス演算子&
を使用します。&
を変数の前につけることで、その変数のメモリ上のアドレスを取得できます。
例えば、&i
と書いてあったら、変数i
のメモリのアドレスを表しそれを取得します。
ポインターって、今まで全然やったことなかったんですけど、何となくわかった気がします。
Discussion