首页 >后端开发 >Golang >Go 接口中的值与指针接收器:接口分配何时失败?

Go 接口中的值与指针接收器:接口分配何时失败?

Susan Sarandon
Susan Sarandon原创
2024-11-19 15:02:02943浏览

Value vs. Pointer Receivers in Go Interfaces: When Does Interface Assignment Fail?

理解 Go 结构方法和接口实现

在 Go 中,实现接口的方法可以分为两种类型:带有值接收器的方法以及带有指针接收器的方法。然而,在实现接口时,接口值的可分配性与直接结构体方法调用不同。

考虑提供的代码片段:

type greeter interface {
    hello()
    goodbye()
}

greeter 接口定义了两个方法,hello 和再见。

type tourGuide struct {
    name string
}

tourGuide 结构体实现了问候语接口。

func (t tourGuide) hello() {
    fmt.Println("Hello", t.name)
}

方法 hello 有一个值接收器,它允许使用tourGuide类型的变量直接调用方法。

func (t *tourGuide) goodbye() {
    fmt.Println("Goodbye", t.name)
}

方法 goodbye,另一方面,有一个指针接收器,需要一个指针变量来调用。

现在,让我们检查一下接口实现:

var g2 greeter = t2
g2.hello()   // Hello Smith
g2.goodbye() // Goodbye Smith

将 *tourGuide 类型的指针变量 t2 分配给接口类型greeter 的接收者值会成功,因为指针接收者允许获取值的地址,然后将其用作接收者。

var g1 greeter = t1

但是,将tourGuide类型的非指针变量t1分配给接口类型greeter的接收者值会失败。这是因为带有指针接收器的方法需要指针接收器,而值本身不能直接用作指针。

总而言之,带有值接收器的方法可以使用值或指针来调用,而带有指针接收器的方法只能使用指针来调用。当使用具有指针接收器的方法实现接口时,使用指针作为基础类型至关重要。

以上是Go 接口中的值与指针接收器:接口分配何时失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn