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

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

最佳答案

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

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

关于pointers - 使用非指针值调用指针接收器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47824826/

相关文章:

c++ - 为什么内存地址是偶数?

printing - 如何打印到实际打印机?

c++ - 仅当指针作为参数传递给函数时才存在类型别名问题吗?

c - 如何创建这个公式?

git - 符号链接(symbolic link)到 GOPATH 文件夹是常见的做法吗?

go - 一个关于 Go Channel 的死锁及其原因的简单示例

go - 只为接口(interface)传递方法参数一次?

testing - 如何在 Golang 中解码 Reflect.Value

c - 在函数内部创建的动态内存

c++ - C & C++ : What is the difference between pointer-to and address-of array?