📚

[Go] Method, Pointer Receiver

2022/09/24に公開

これだと、area関数にvを渡している。vと関数には結びつきはない。

package main

import (
	"fmt"
)

type Ver struct {
	X, Y int
}
// Ver型を引数vに取り、intを返す
func Area (v Ver) int {
	return v.X * v.Y
}

func main () { 
v := Ver{1,2}
fmt.Println(Area(v))
}

2

こちらの方がわかりやすい。vとArea関数の結びつきもできる。
呼び出しは、v.Area()でできる。
ちなみに、このようにドットで呼び出せるものをメソッドという。

type Ver struct {
	X, Y int
}

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

// Ver型を引数vに取り、intを返す
func Area (v Ver) int {
	return v.X * v.Y
}

func main () { 
v := Ver{1,2}
fmt.Println(Area(v))
fmt.Println(v.Area())
}

X,Yの値を変えたいとき

*を型の前につけると、実体を書き換えられる。

type Ver struct {
	X, Y int
}

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

// iというintを引数に取るScale()
func (v *Ver) Scale(i int) {
	v.X = v.X * i
	v.Y = v.Y * i
}

// Ver型を引数vに取り、intを返す
func Area (v Ver) int {
	return v.X * v.Y
}

func main () { 
v := Ver{1,2}
// fmt.Println(Area(v))
v.Scale(10)
fmt.Println(v.Area())
}

200

*をとると、返ってくる値が変わる。

type Ver struct {
	X, Y int
}

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

// iというintを引数に取るScale()
func (v Ver) Scale(i int) {
	v.X = v.X * i
	v.Y = v.Y * i
}

// Ver型を引数vに取り、intを返す
func Area (v Ver) int {
	return v.X * v.Y
}

func main () { 
v := Ver{1,2}
// fmt.Println(Area(v))
v.Scale(10)
fmt.Println(v.Area())
}

2

つまり、*Verにすることで、
Ver Structに紐づいたScale()メソッドの中で、Structの中身を書き換えられる。
これがPointer Receiver.

Discussion