<<Go语言编程>>疑问(已解决)

//<<Go语言编程>>.许式伟.p74

type Integer int

func (a Integer) Less(b Integer) bool {
    return a < b
}

func (a *Integer) Add(b Integer) {
    *a += b
}

type LessAdder interface {
    Less(b Integer) bool
    Add(b Integer)
}

func main() {
    var a Integer = 1
    var b LessAdder = a //错误
}

书上说func (a *Integer) Add(b Integer)无法自动生成

func (a Integer) Add(b Integer){
   (&a).Add(b)
}

因为 (&a).Add() 改变的只是函数参数 a ,对外部实际要操作的对象并无影响,这不符合用户的预期.

请问最后一句的原因是怎么理解的?

共 2 个回复


stevewang

func (a Integer) Add(b Integer)等效于func Add(a, b Integer)。第一个参数被复制到调用栈上,所以*a += b改变的是调用栈上的a,而不是函数调用环境里的a

# 0

chenhao

理解了:

type Integer int

func (a *Integer) Add(b Integer) {
    *a += b
}

func (a Integer) Bdd(b Integer) {
    (&a).Add(b)
}

type LessAdder interface {
    Add(b Integer)
}

func main() {
    var a, b, c Integer = 1, 1, 2
    p := &a

    p.Add(c)
    fmt.Println(a)

    b.Bdd(c)
    fmt.Println(b) //b=1,期望为3,与期望不符
}
# 1