在 Go 中,返回接口的接口方法只匹配声明接口本身的实现,而不是具体的实现实现接口的类型。考虑以下示例:
<code class="go">package main import "fmt" type Foo struct { val string } func (f *Foo) String() string { return f.val } type StringerGetter interface { GetStringer() fmt.Stringer } type Bar struct{} func (b *Bar) GetStringer() *Foo { return &Foo{"foo"} } func Printer(s StringerGetter) { fmt.Println(s.GetStringer()) } func main() { f := Bar{} Printer(&f) // compile-time error }</code>
此代码给出以下编译时错误:
cannot use &f (type *Bar) as type StringerGetter in argument to Printer: *Bar does not implement StringerGetter (wrong type for GetStringer method)
要解决此问题,Bar 类型中的 GetStringer 方法应返回 fmt .Stringer 接口而不是具体的 *Foo 类型,或者应该修改 StringerGetter 接口以接受具体类型而不是接口。
在修改外部具体类型的情况下或者共享接口不理想,有两种替代解决方案:
<code class="go">type MyBar struct { Bar } func (b *MyBar) GetStringer() fmt.Stringer { return b.Bar.GetStringer() }</code>
<code class="go">type MyBar struct { embed Bar } func (b *MyBar) GetStringer() fmt.Stringer { return b.GetStringer() }</code>
两种方法都允许您使用外部具体类型,同时提供所需的接口实现,而无需修改原始类型或共享接口。
以上是为什么具体类型实现不能满足 Go 中返回接口的接口方法?的详细内容。更多信息请关注PHP中文网其他相关文章!