学習履歴

プログラミングなどの学習履歴

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

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