У меня есть интерфейс с одним методом, который возвращает фрагмент другого интерфейса.Вот простое представление:
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
Чтоя делаю что-то не так?
Редактировать после комментариев
Я попытался изменить метод на возврат только одной машины, чтобы избежать проблем со срезами интерфейсов, но он все еще жалуется.Просто ради того, чтобы я хотел понять, что происходит.Поскольку MyCar
реализует Car
, я не ожидал следующей ошибки:
*mygarage.MyGarage does not implement Garage (wrong type for GetCar method)
have GetCar() mygarage.MyCar
want GetCar() Car
Я считаю, что проблема заключается в типизированном типе возврата, MyCar не является автомобилем, но должна быть возможность разыгратьэто одно, но Go не принимает это в качестве действительной реализации для интерфейса Garage?