ミヤマです。
go言語(golang)が最近、WEB系の技術として流行ってきています。
ただgolangのポインタという概念で引っかかる人が多いのではないでしょうか。
そこで今回はgolangのポインタについて解説していきます。
そもそもポインタとは?
[word_balloon id=”2″ size=”M” position=”L” name_position=”under_avatar” radius=”true” balloon=”talk” balloon_shadow=”true”] そもそもポインタってなに?[/word_balloon]
という疑問を持っている方に答えましょう。
ポインタを一言で言うと、「変数を管理する変数」です。
変数はPCのメモリの中に保存される
golangでこのように変数を宣言したとします。
func main() {
var hoge string = "hoge"
var fuga string = "fuga"
p := &hoge
p2 := &fuga
fmt.Println(hoge)
fmt.Println(fuga)
fmt.Println(p)
fmt.Println(p2)
}
// 出力結果
hoge
fuga
0xc0001021e0
0xc0001021f0
numberという変数は、PCのメモリの中に保存されています。
hogeという変数も同様に保存されています。
つまり、一つ一つの変数対してメモリの領域が確保されるということです。
このメモリの領域のことをアドレスと言います。
ポインタを使うメリット: 効率的に処理できる
先のgolangのプログラムを修正してp = p2としてポインタは同じアドレスを指すようにします。
func main() {
var hoge string = "hoge"
var fuga string = "fuga"
p := &hoge
p2 := &fuga
p = p2
fmt.Println(hoge)
fmt.Println(fuga)
fmt.Println(p)
fmt.Println(p2)
fmt.Println(*p)
fmt.Println(*p2)
}
// 出力結果
hoge
fuga
0xc000010210
0xc000010210
fuga
fuga
このようにポインタを使うことで、変数そのものを取得するだけでなく、ポインタから値を取得することができます。
[word_balloon id=”2″ size=”M” position=”L” name_position=”under_avatar” radius=”true” balloon=”talk” balloon_shadow=”true”]これで何がいいの?[/word_balloon] と疑問ですよね。
実はプログラムにおいて変数を宣言すればするほど、メモリ領域を確保する必要があり、それだけマシンに負荷をかけます。
その点、ポインタを積極的に使うことでマシン負荷の少ない効率的なプログラムを書くことができます。
ポインタはメモリで理解する
では、実際にポインタについて、ソースコードを用いて解説します。
func main() {
var hoge string = "hoge"
var fuga string = "fuga"
// 「&」をつけるとアドレスを指定します
p := &hoge
p2 := &fuga
p = p2
fmt.Println(hoge)
fmt.Println(fuga)
fmt.Println(p)
fmt.Println(p2)
// 「*」をつけるとポインタが指す変数を取得します
fmt.Println(*p)
fmt.Println(*p2)
}
ここで重要なのは、
&(アンパサンド)をつけると変数のアドレスを指す
*(アスタリスク)をつけると、アドレスの値を取得する
ということです。
[word_balloon id=”1″ size=”M” position=”L” name_position=”under_avatar” radius=”true” balloon=”talk” balloon_shadow=”true”]「*p→*(&hoge)→hoge」 という変換するイメージですね[/word_balloon]まとめ
golangを使う企業は少しずつ日本でも増えてきています。
その波に乗り遅れないためにも、golangを勉強することをオススメします。
golangを勉強するサイトとして、A tour Of Go というサイトがあるので、そこからまずはやってみてください。