基于指针对象的方法
当调用一个函数时,会对其每个参数值进行拷贝,如果一个函数需要更新一个变量
或者函数的其中一个参数实在太大我们希望能够避免进行这种默认拷贝,在这种
情况下我们就需要用到指针。对应到我们这里用来更新接收器的对象的方法,当这
个接收者变量本身比较大时,我们就可以用其指针而不是对象来声明方法

func (p *Point) ScaleBy (factory float64) {
    p.X *= factory
    p.Y *= factory
}

(*Point).ScaleBy

r := &Point{1,2}
r.ScaleBy(2)
fmt.Println(*r) // {2,4}
Nil也是一个合法的接收器类型

就像一些函数允许nil指针作为参数一样,方法理论也可以用nil指针作为其接收者。尤其当nil对于对象来说是合法的零值时,比如 Map 或者 slice。在下面的简答的int链表的例子里,nil代表的空链表。

type IntList struct {
    Value int
    Tail *IntList
}

func (list *IntList) Sum() int {
    if list == nil {
        return 0
    }
    return list.Value + list.Tail.Sum()
}    

Gabriel
36 声望4 粉丝