【golang】参照(ポインタ)渡しはパターンで覚えよう!!

HSP

golangで参照渡しは理解のしかたでカンタンになる

golangのポインタの使い方ってわからないですよね。

それは初めてであればあるほど。。。今回は、そんなgolangの参照渡しについて解説してきます。

参照(ポインタ)渡しで大事なのは、ポインタの理解のしかたです。

そして、このポインタの理解のしかたでカンタンになります。この記事を読む終わるときには、

[word_balloon id=”1″ size=”M” position=”L” name_position=”under_avatar” radius=”true” balloon=”talk” balloon_shadow=”true”]ポインタとはどんなものか、がわかる!

golangのソースコードレベルで参照渡しがわかる!

[/word_balloon] というふうになっているはずです。

golangの参照渡しが理解できないワケ

[word_balloon id=”1″ size=”M” position=”L” name_position=”under_avatar” radius=”true” balloon=”talk” balloon_shadow=”true”]golangの参照(ポインタ)渡し、全然わからない。。。
[/word_balloon]

このようになるのは、そもそものポインタという概念がわからないから。しかし、そのわからないままで勉強を進めても要所で出現するポインタ。

golangにおいてポインタを避けては通れません。

ここで挫折をしてgolangの勉強をやめてしまう人も多いでしょう。大事なのは、なんとなくではなくコードを意識して、理解して書くことです。

「その変数は値か?ポインタか?」を意識する

ポインタを理解して書くには、「この変数は値か?ポインタか?」を意識しましょう。

コードとして、「その変数が値なのか、ポインタなのか」を見分ける公式はあります。次にそれを紹介します。

ポインタか値かを見分ける公式

どんなテキストにもポインタやアドレスを細かに説明が難しく書かれがちですが、公式を使えば一撃です。

その公式はこれです。

この公式の解釈としては、

  • 変数に&(アンパサンド)をつけたらそれはポインタになる
  • ポインタに*(アスタリスク)をつけたら、それは値になる

です。補足すると、ポインタが指すのはメモリ上のアドレスになります。

golangの参照渡しをコードで理解する

実際にコードの中で先の公式を意識しながら参照渡しについて解説していきます。

例えば、こんなコードがあります。

package main

import (
	"fmt"
)

func main() {
	var hoge string = "hoge string"
	var p *string = &hoge
	hogeValFunction(*hoge)
	fmt.Println(hoge)
	fmt.Println(*p)
}

func hogeValFunction(p string) {
	p = "hogeValFunction"
}

// 出力結果
hoge string
hoge string

mainメソッドのhogeValFunctionメソッドに*pを渡して、hogeの初期値(“hoge string”)を”hogeValFunction”に書き換えています。ここでいう*pはhogeと同じものです。

それの出力結果としては、変数hogeとhogeのポインタ(変数p)から引き出した値どちらも”hoge string”となります。なんの違和感もなく理解ができると思います。

参照渡しすると変なコトが起こる

参照渡しのメソッドがあると、変なことが起こります。ではさっきのコードをこんなふうに書き換えてみます。

package main

import (
	"fmt"
)

func main() {
	var hoge string = "hoge string"
	var p *string = &hoge
	hogeRefFunction(p)
	fmt.Println(hoge)
	fmt.Println(*p)
}

func hogeRefFunction(p *string) {
	*p = "hogeRefFunction"
}

// 出力結果
hogeRefFunction
hogeRefFunction

hogeのポインタpを渡して、hogeRefFunctionメソッドで*pに格納されている”hoge string”を”hogeRefFunction”に書き換えています。すると、変数hogeの値は更新していないのに”hogeRefFunction”という文字列になってしまいます。

これが参照渡しです。

参照渡しをすることで返り値がなくても、アドレスから値を引き出して書き換えることができるようになります。

このように参照渡しを使うと、メソッドから複数の返り値を返すことができ、より便利にgolangのコードを書くことできます。

まとめ

今回はgolangの参照渡しについて解説してきました。PHPをはじめとするインタプリタ言語では、参照渡しという方法はなくて、とっつきにくいものかもしれません。

そんなときに今回紹介した公式を使えば一撃でポインタを理解することができます。それさえ理解できれば、参照渡しは理解もカンタンです。

この要点を頭に入れて、golangを書いてみてください。とはいえ、プログラミングは自分で書けるようになるためには、実際に書いてみるしかありません

golangを勉強するなら、tour of Goを一通りやってみるのがオススメです。

ポインタについては、この記事でも解説しています。↓

【Golang】ポインタを理解しよう

HSPに関することならこんな記事が読まれています。↓