【问题标题】:Calling pointer receiver method with non pointer value使用非指针值调用指针接收器方法
【发布时间】:2017-12-15 02:06:56
【问题描述】:

请看下面的代码。我知道这是一个事实,非指针接收器可以接受指针和非指针值,但指针接收器只能接受指针值。话虽如此,我不明白最后一个电话是如何工作的,而倒数第二个电话不是。 (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()
}

【问题讨论】:

标签: pointers go


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多