Methods and pointer indirection
タイトルはA Tour og Goにあるタイトルです。
⇒https://go-tour-jp.appspot.com/methods/6
この章をやったことのメモです。
ページを開いたときは以下のようなコードです。
package main
import "fmt"
type Vertex struct {
X, Y float64
}
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func ScaleFunc(v *Vertex, f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func main() {
v := Vertex{3, 4}
v.Scale(2)
ScaleFunc(&v, 10)
p := &Vertex{4, 3}
p.Scale(3)
ScaleFunc(p, 8)
fmt.Println(v, p)
}
これを以下のように変えても同じ結果になりました。
package main
import "fmt"
type Vertex struct {
X, Y float64
}
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func (v *Vertex) ScaleFunc(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func main() {
v := Vertex{3, 4}
v.Scale(2)
v.ScaleFunc(10)
p := &Vertex{4, 3}
p.Scale(3)
p.ScaleFunc(8)
fmt.Println(v, p)
}
単純にScalaFuncメソッドの引数を一つにして、
メソッドレシーバーを先頭に持ってきただけです。
結果的には二つのメソッドの書き方を同じようにしただけですが、
メソッドレシーバーをメソッドの引数の一員にしようがしまいが
結果的には同じ処理になることを確認したかっただけです。
ポインタやポインタを使ったメソッドはGO言語からが初めてなので、
使い方に慣れるまで少し時間が必要だなと思いました。