繁体   English   中英

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

[英]Calling pointer receiver method with non pointer value

请参见下面的代码。 我知道非指针接收器可以接受指针和非指针值,但是指针接收器只能接受指针值。 话虽这么说,我不明白最后一个电话是如何工作的,倒数第二个电话却没有。 在这里跑

问题是我可以从非指针方法调用指针接收器方法。 另一个类似的问题中没有对此进行解释。 该答案仅说明了有关指针调用指针接收器方法的信息。

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()
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM