😺

【Go】ポインタの使い方

2022/08/11に公開

この記事の対象

.ポインタ型の使い方がわからない人

背景

goでポインタやアドレスなどを聞いてもあまり理解できなかったです。しかし、goを触っていくうちに少し理解が深まったので、ここに基本的なことをまとめたいと思いました。厳密な説明はしていないです。そこは別の記事でまとめます。

ポインタ型の使い方

🚨ポインタ型は構造体の中にある値を変更したい時に使います。型の値をそのまま使うことは少ないので、HogeBのような使い方をすることが多いです。

例えば、以下の時です。

package main

import "fmt"

type Hoge struct{ value int }

// 型にある値(ここではh.value)を使って関数の処理をする。こちらでは型の中の値を書き換えることはできない。
func (h Hoge) HogeA() int {
	return h.value * h.value
}

// ポインタ型なので、h.valueを書き換えて関数の処理をする。
func (h *Hoge) HogeB(v int) {
	h.value = v + 5
}

func main() {
	var h Hoge
	h.value = 6
	// 36が出力される
	fmt.Printf("HogeA(ポインタ型ではない)の出力結果:%v\n", h.HogeA())

	h.HogeB(0)
	// +5された値が出力される
	fmt.Printf("HogeB(ポインタ型である)の出力結果:%v\n", h.value)
}

ポインタ型とは

なんとなくポインタ型の使い方を見てもらったとと思うので、ここからはポインタ型を説明していきます。
ポインタとは、メモリのアドレス情報(0x14000104210、こんな感じの文字列)のことです。値に&をつけると取得することができます。値を変更するときはここにアクセスする必要があります。例を見てみましょう。

main.go
type Hoge struct {
	Str string
}

func main() {

	// 値として、pに代入
	p := Hoge{
		Str: "test",
	}

	fmt.Println(p.Str)

	p2 := p
	p2.Str = "test2"
	fmt.Println(p.Str)

	// &pで*Person(Personのポインタ型)を生成する
	p3 := &p
	p3.Str = "test3"

	fmt.Println(p3.Str)
}


[result]
test
test
test3

上記のようにp3でポインタ型にしているのでここにアクセスすることで値を変更することができます。p2はポインタ型ではないので、値を変更することができません。

いかがだったでしょうか。少しフワッとした説明になりましたが、使い方をまとめてみました。厳密な説明は別の記事にします。

Discussion