使用非指针值调用指针接收器方法

时间:2017-12-15 02:06:57

标签: pointers go

请参阅下面的代码。我知道非指针接收器可以接受指针和非指针值,但指针接收器只能接受指针值。话虽如此,我无法理解最后一次通话是如何工作的,倒数第二次也不是。 (Run Here

问题是我能够从非指针方法调用指针接收器方法。 other similar question中没有解释这一点。该答案仅解释了指针调用指针接收器方法。

package main

import (
    "fmt"
)

type person struct {
    name string
}

type human interface {
    speak() string
}

func (p *person) speak() string {
    return "Speak() called by " + p.name
}

func saySomething(h human) {
    fmt.Println("area", h.speak())
}

func main() {
    p := person{"harsh"}
    //works
    saySomething(&p)

    //doesn't work
    //saySomething(p)

    //works
    p.speak()
}

1 个答案:

答案 0 :(得分:1)

第二个调用不起作用,因为person类型没有实现human接口(只有*person)。 "魔术"允许您在非指针值上调用带有指针接收器的方法,反之亦然,仅适用于那些特定情况。将值赋给接口变量或字段或将其作为需要接口的参数传递时,值的类型必须实现接口。

如果您要调用p.speak(),编译器会自动将其更改为(&p).speak()。如果你有一个带有非指针接收器的方法并且你在指针上调用它,那么在另一个方向上会发生类似的转换。