【发布时间】:2019-09-27 07:38:38
【问题描述】:
我有一个接口,其中一个方法返回另一个接口的一部分。这是一个简单的表示:
type Garage interface {
AllCars() []Car
}
type Car interface {
Name() string
}
我也为此做了一个实现:
type MyGarage struct{}
func (g MyGarage) AllCars() []MyCar {
return make([]MyCar, 0)
}
type MyCar struct {
name string
}
func (c MyCar) Name() string {
return c.name
}
现在在我的测试中我做了一个函数:
func TestAllCars(t *testing.T) {
var garage Garage
garage = new(mygarage.MyGarage)
cars := garage.AllCars()
fmt.Println(cars)
}
Go 抱怨 MyGarage 没有实现 Garage 接口,我理解但没想到,因为 MyCar 确实实现了 Car,所以这对我来说应该不是问题。
cannot use new(mygarage.MyGarage) (type *mygarage.MyGarage) as type Garage in assignment:
*mygarage.MyGarage does not implement Garage (wrong type for AllCars method)
have AllCars() []mygarage.MyCar
want AllCars() []Car
我在这里做错了什么?
在 cmets 之后编辑
我尝试将方法更改为只返回一辆汽车,以避免围绕接口切片的问题,但它仍然抱怨。只是为了我想了解发生了什么。由于MyCar 实现了Car 我没想到会出现以下错误:
*mygarage.MyGarage does not implement Garage (wrong type for GetCar method)
have GetCar() mygarage.MyCar
want GetCar() Car
我认为问题在于强类型返回类型,MyCar 不是 Car,但应该可以将其强制转换为一个,但 Go 不接受将其作为 Garage 接口的有效实现?
【问题讨论】:
-
MyGarage.AllCars()必须返回[]Car,[]MyCar不一样。 -
是的,但这会产生我试图避免的依赖关系。既然
MyGarage可以在没有依赖的情况下实现Garage,为什么MyCar不能对Car做同样的事情? -
这是因为一个接口切片不是一个接口见下面github.com/golang/go/wiki/InterfaceSlice
-
请注意,函数/方法的签名是它的类型。
T类型实现接口I,T类型必须实现I的方法,并且方法的类型/签名必须匹配逐字。