📚
[Go] Method, Pointer Receiver
これだと、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