*の方向性はどうでもいい

プログラミングなどの学習履歴として最初は書いてたけどもう何でもいいやと思って今に至る

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言語からが初めてなので、

使い方に慣れるまで少し時間が必要だなと思いました。