Skip to Content

Go ポインタの書き換え

概要

前回ポインタ初歩 を始めたので今回はポインタの書き換え
書籍 入門GoプログラミングのLESSON 26を復習

ただの変数の例

children変数の中身は関数に渡しても書き換えられない

テストコード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func main() {
	var children string = "惣流・アスカ・ラングレー"
	result := shingeki(children)
	fmt.Println(children)
	fmt.Println(result)
}

func shingeki(s string) string {
	s = "式波・アスカ・ラングレー"
	return s
}
実行結果

childrenは当然 惣流 のまま

惣流・アスカ・ラングレー
式波・アスカ・ラングレー

ポインタ型の例

関数やメソッドの境界を超えて値の書き換えに利用できる

childrenメモリアドレス を関数に渡して書き換え
関数側でメモリアドレスをデリファレンスして新しい値を入れる

テストコード

ポインタ対応に少し修正

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func main() {
	var children string = "惣流・アスカ・ラングレー"
	result := shingeki(&children) // &をつけてメモリアドレスを渡す
	fmt.Println(children)
	fmt.Println(result)
}

// *string ポインタ型で受け取る
func shingeki(s *string) string {
	*s = "式波・アスカ・ラングレー" // デリファレンスしてから値を入れる
	return *s
}
実行結果

元々のchildrenのメモリアドレスの場所に関数側で式波を入れたので、
結果は元々のchildren式波 になった(どっちも式波!)

式波・アスカ・ラングレー
式波・アスカ・ラングレー

戒め

ポインタは便利かもしれませんが、複雑になります。
値を複数の場所から変更できるとしたら、コードを追いかけるのが難しくなるでしょう。

感想

構造体を使ったポインタの受け渡しがAWS SDK使ってると多いので、
次回は構造体とポインタをテーマにしよう

参考

入門Goプログラミング
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発