見出し画像

[Go言語 入門] ポインタレシーバと値レシーバ

golangで作ってみたいものがあり、golangを学び始めたので学習したことを書いていくノート。

---------------------------------------------------

サイトマップはこちら

---------------------------------------------------

第15回 ポインタレシーバーと値レシーバー


golang にはクラスという概念がない。

レシーバを使うことで、クラス内メソッドのような関数を定義することができる。

以下のような構造体があると仮定する。

//main.go

type Vertex struct {
	X int
	Y int
}

値を渡すレシーバを値レシーバといい、以下のように書くことができる。

「 func (変数名 構造体名) 関数名( )  { } 」

func (v Vertex) Area() int {
	return v.X * v.Y
}

またポインタを渡す場合は、ポインタレシーバといい、以下のように書くことができる。

「 func (変数名 *構造体名) 関数名( )  { } 」

func (v *Vertex) Scale(i int) {
	v.X *= i
	v.Y *= i
}

以下実行例

func main() {
	v := Vertex{10, 20}
	fmt.Println(v.Area())

	v.Scale(10)
	fmt.Println(v.Area())
}

// 実行結果
// 200
// 20000

Area関数は、X と Y を掛けた値を返す。

Scale関数は、XとYをそれぞれ n 倍する関数。ポインタを渡しているため、X と Y は n 倍に更新される。

1行目:X に「10」、Y に「20」の値を持つ構造体vを宣言。

2行目:Area関数を実行し出力。

3行目:Scale関数を実行。X と Y は10倍した値に書き換わる。

4行目:3行目で書き換えられた値でArea関数を実行し出力。

以上


この記事が気に入ったらサポートをしてみませんか?