![見出し画像](https://assets.st-note.com/production/uploads/images/65807689/rectangle_large_type_2_95a0df21a38dacb5fbeab1ab7558d94c.png?width=1200)
[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関数を実行し出力。
以上