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

don*_*atJ 7 types interface go

我正在尝试让 Go 接口工作,而我遇到的问题是,返回 go 接口的 Go接口方法仅在实现声明该接口而不是实现该接口的具体类型时才有效。

在以下示例中我收到:

prog.go:29: 无法使用 &f (type *Bar) 作为 Printer 参数中的 StringerGetter 类型:*Bar 未实现 StringerGetter(GetStringer 方法的类型错误)有 GetStringer() *Foo 想要 GetStringer() fmt.Stringer

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)
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改func (b *Bar) GetStringer() *Foo {func (b *Bar) GetStringer() fmt.Stringer {它会按预期工作。

Foo确实满足fmt.Stringer

问题在于上面是说明问题的简单示例代码。

就我尝试编写的代码而言,我创建的接口位于我的"main"包中,而我正在编写接口的具体类型位于我不想修改的第三方包中。

我也希望能够编写自己的结构来实现所述接口,因此针对具体返回类型的接口也不是一种选择。

我必须假设有一种方法可以做到这一点。

Vol*_*ker 2

我也希望能够编写自己的结构来实现所述接口,因此针对具体返回类型的接口也不是一种选择。

“我想要”和 Go 不太匹配。

我必须假设有一种方法可以做到这一点。

不,那里没有。接口完全匹配。Go 没有超类型或专业化的概念。