首页  >  文章  >  后端开发  >  为什么具体类型实现不能满足 Go 中返回接口的接口方法?

为什么具体类型实现不能满足 Go 中返回接口的接口方法?

DDD
DDD原创
2024-10-26 22:48:03336浏览

Why Doesn't a Concrete Type Implementation Satisfy an Interface Method Returning an Interface in Go?

返回接口的接口方法与具体类型实现不匹配

在 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 接口以接受具体类型而不是接口。

替代解决方案

在修改外部具体类型的情况下或者共享接口不理想,有两种替代解决方案:

  1. 创建包装类型:您可以创建一个包装外部具体类型并实现所需的新类型界面。例如:
<code class="go">type MyBar struct {
    Bar
}

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.Bar.GetStringer()
}</code>
  1. 嵌入具体类型: 或者,您可以将外部具体类型嵌入到您自己的类型中,并使用嵌入类型的接口来实现接口方法。例如:
<code class="go">type MyBar struct {
    embed Bar
}

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.GetStringer()
}</code>

两种方法都允许您使用外部具体类型,同时提供所需的接口实现,而无需修改原始类型或共享接口。

以上是为什么具体类型实现不能满足 Go 中返回接口的接口方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

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