gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:24:40 24 4
gpt4 key购买 nike

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

在下面的例子中我收到了:

prog.go:29: cannot use &f (type *Bar) as type StringerGetter in argument to Printer: *Bar does not implement StringerGetter (wrong type for GetStringer method) have GetStringer() *Foo want 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)
}

但是,如果我将 func (b *Bar) GetStringer() *Foo { 更改为 func (b *Bar) GetStringer() fmt.Stringer {,它的工作方式如下预期。

Foo 确实实现了 fmt.Stringer

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

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

我也希望能够编写自己的结构来实现上述接口(interface),因此针对具体返回类型的接口(interface)也不是一个选项。

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

最佳答案

您的问题是您试图使其他人(即另一个包的)类型符合它实际上不符合的接口(interface)。你不能那样做。但是您可以使您的 类型符合任何您想要的。你可以让你的类型包裹他们的类型。有两种方法可以做到这一点。 Here's one :

type MyBar Bar

func (b *MyBar) GetStringer() fmt.Stringer {
return &Foo{"foo"}
}

func main() {
f := MyBar(Bar{})
Printer(&f)
}

现在我们创建了一个新类型 MyBar,它包装了一个 Bar 并提供了您想要的界面。但是,这种方法不会“继承”Bar 的任何其他功能。您必须包装您想要的每个单独的东西,并且您可能必须重新实现(因为您无权访问底层实现)。

但您也可以嵌入 Bar,并“继承”您不更改的所有内容并访问底层 impl(这可能更接近您在这里想要的)。 For example :

type MyBar struct{ Bar }

func (b *MyBar) GetStringer() fmt.Stringer {
return b.Bar.GetStringer()
}

func main() {
f := MyBar{Bar{}}
Printer(&f)
}

现在,如果 Bar 有其他方法,它们将免费显示在 MyBar 上。根据您的问题,两者都有用。您可以使用此技术帮助其他包类型符合您的要求。

这并不意味着 BarMyBar 可以互换,但它们非常接近并且很容易根据需要在它们之间进行转换。

关于Go接口(interface)方法返回接口(interface)与返回具体类型的方法不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com