如何使一个接口方法返回另一个接口?

时间:2019-09-27 07:38:38

标签: go interface

我有一个接口,其中一个方法返回另一个接口的一部分。这是一个简单的表示形式:

    <!-- 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接口的有效实现?

1 个答案:

答案 0 :(得分:0)

这与接口切片不是接口有关,也就是说,我认为以下内容为您提供了所需的内容。

enter image description here

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)
}