我有一个接口,其中一个方法返回另一个接口的一部分。这是一个简单的表示形式:
<!-- Oracle JDBC driver -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0</version>
</dependency>
<!-- HikariCP connection pool -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.6.0</version>
</dependency>
我也为此做了一个实现:
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
}
Go抱怨MyGarage没有实现Garage接口,这是我理解的,但是没有想到,因为MyCar确实实现了Car,所以这对我来说应该不是问题。
func TestAllCars(t *testing.T) {
var garage Garage
garage = new(mygarage.MyGarage)
cars := garage.AllCars()
fmt.Println(cars)
}
我在这里做什么错了?
我尝试将方法更改为只返回一辆汽车,以避免围绕接口切片的问题,但它仍然会抱怨。只是为了我想了解发生了什么。由于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
实现了MyCar
,所以我没有想到以下错误:
Car
我认为问题在于返回类型是强类型,MyCar不是Car,但是应该可以将其强制转换为一个,但是Go不能接受那作为Garage接口的有效实现?
答案 0 :(得分:0)
这与接口切片不是接口有关,也就是说,我认为以下内容为您提供了所需的内容。
type Garage interface {
AllCars() []Car
}
type Car interface {
Name() string
}
type MyGarage struct{
}
func (g MyGarage) AllCars() []Car {
x := []Car{MyCar{}}
return x
}
type MyCar struct {
name string
}
func (c MyCar) Name() string {
return c.name
}
func main() {
var garage Garage
garage = MyGarage{}
cars := garage.AllCars()
fmt.Println(cars)
}