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())
}
相关文章
相关标签/搜索