满足接口的 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中文网其他相关文章!