go 結構的方法總結

方法能夠與命名類型或命名類型的指針關聯。指針

剛剛看到的兩個 Abs 方法。一個是在 *Vertex 指針類型上,而另外一個在 MyFloat 值類型上。 有兩個緣由須要使用指針接收者。首先避免在每一個方法調用中拷貝值(若是值類型是大的結構體的話會更有效率)。其次,方法能夠修改接收者指向的值。code

嘗試修改 Abs 的定義,同時 Scale 方法使用 Vertex 代替 *Vertex 做爲接收者。效率

當 v 是 Vertex 的時候 Scale 方法沒有任何做用。`Scale` 修改 `v`。當 v 是一個值(非指針),方法看到的是 Vertex 的副本,而且沒法修改原始值。import

Abs 的工做方式是同樣的。只不過,僅僅讀取 `v`。因此讀取的是原始值(經過指針)仍是那個值的副本並無關係。float

package main

import (
    "fmt"
    "math"
)

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) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    v.Scale(5)
    fmt.Println(v, v.Abs())
}
相關文章
相關標籤/搜索