具体示例在这里:https://play.golang.org/p/ZNmviKWLwe

我有一个接口(interface)A。我希望A的所有实现都具有某个签名(因此该接口(interface))。我希望其中一个返回有用的东西,以实现另一个接口(interface)。

type Box interface {
    GetToy(int) (*Toy, error)
}
type Toy interface{
    Play()
}


type CarBox struct {
   Length int
   Width int
   Height int
   toys []*Matchbox
}
type Matchbox struct {}

func (b *CarBox) Size () int {
    return b.Length*b.Width*b.Height
}
func (b *CarBox) GetToy(j int) (*Matchbox, error) {
    return b.toys[j], nil
}
func (m *Matchbox) Play() {
    fmt.Println("Zoom!")
}

但是,当然,这是行不通的,因为GetToy()返回的是*Matchbox而不是*Toy,即使MatchboxToy的完全可接受的实现。而且,不,不是因为指针。无论我返回*Toy中的GetToy还是返回Toy,它都给出相同的结果:
tmp/sandbox721971102/main.go:33:15: cannot use CarBox literal (type CarBox) as type Box in return argument:
    CarBox does not implement Box (wrong type for GetToy method)
        have GetToy(int) (*Matchbox, error)
        want GetToy(int) (*Toy, error)

显然,我的模式与go的工作方式不符。执行此操作的“正确”方法是什么?

最佳答案

首先,您几乎几乎不需要指向接口(interface)类型的指针。因此,GetToy方法签名应更改为:

type Box interface {
    GetToy(int) (Toy, error) // use Toy, not *Toy
}

现在,请注意,接口(interface)由类型隐式满足。结果,通过实现Play()方法,*Matchbox隐式满足Toy接口(interface)(请注意*,实现Toy接口(interface)的类型是Matchbox的指针,而不是Matchbox的指针)。

这意味着*Matchbox类型的值可以代替Toy类型。所以剩下的就是修复在GetToy上定义的*CarBox方法:
func (b *CarBox) GetToy(j int) (Toy, error) {
    return b.toys[j], nil
}

现在上面的GetToy将返回一个确实实现*Matchbox接口(interface)的Toy

关于go - 我如何有golang接口(interface)实现返回另一个接口(interface)的实现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47246669/

10-09 13:23