理解 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中文网其他相关文章!