首页 > 后端开发 > Golang > 为什么带有指针接收器方法的 Go 结构不能满足接口?

为什么带有指针接收器方法的 Go 结构不能满足接口?

Mary-Kate Olsen
发布: 2024-11-19 17:56:02
原创
910 人浏览过

Why Can't a Go Struct with a Pointer Receiver Method Satisfy an Interface?

满足接口的 Go 结构体方法类型

在 Go 中,结构体可以具有具有不同接收器类型(值或指针)的方法。虽然可以在结构体的值或指针上调用具有值接收器的方法,但具有指针接收器的方法需要指针接收器。

考虑提供的示例:

type greeter interface {
    hello()
    goodbye()
}

type tourGuide struct {
    name string
}

func (t tourGuide) hello()    { fmt.Println("Hello", t.name) }
func (t *tourGuide) goodbye() { fmt.Println("Goodbye", t.name) }
登录后复制

我们可以使用值 t1 和指针 t2 来调用tourGuide 的方法。但是,在实现接口时,不允许将tourGuide值分配给greeter接口变量。

这样做的原因是,如果一个方法有指针接收器,则只能使用指针值作为接收器。由于接口值是包装值的副本并且不可寻址,因此它们无法传递给具有指针接收器的方法。

此限制可以防止通过指针接收器进行的修改只会影响接口中的副本的潜在问题,不是原始值。

因此,对于接受值类型的接口,其所有方法都必须具有值接收器。在我们的例子中,由于goodbye有一个指针接收器,tourGuide不能分配给greeter。

以上是为什么带有指针接收器方法的 Go 结构不能满足接口?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板