具体示例在这里: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
,即使Matchbox
是Toy
的完全可接受的实现。而且,不,不是因为指针。无论我返回*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/