具有相同匿名字段但类型不同的 Go 结构数组

如果你想象我有以下声明:


type Car struct {

    Vehicle

    engineType string

}


type Bus struct {

    Vehicle

    public     bool

    engineType string

}


type Bike struct {

    Vehicle

    motorbike bool

}


type Vehicle struct {

    NumberWheels     int

    NumberPassengers int

    Owner            string

}


type Vehicles []Vehicle



我正在尝试拥有一系列车辆。然而,这是不可能的,因为他们每个人都有不同的类型(即Car,Bus,Bike,等...)


var myCar = Car{Vehicle{4, 4, "Me"}, "Manual"}

var myBike = Bike{Vehicle{2, 0, "Bob and I"}, false}

var myVehicles = Vehicles{myCar, myBike}

for i := range myVehicles {

    fmt.Println(myVehicles[i])

}


你将如何实现这样的事情。还是我试图从错误的角度解决这个问题。我是 Go 的新手


有只小跳蛙
浏览 152回答 1
1回答

侃侃尔雅

Vehicle被嵌入Car和Bus,所以你得到的东西在错误的方向前进......这不像Vehicle是一个父类,所以你不能得到你正在寻找出这个设计的多态行为。你需要的是一个接口。为了向您展示一个工作示例,我将使用空接口(它将允许您在集合中存储任何类型)。对于您的实际程序,您可能想要制作类似IVehicle界面的东西,并在其上放置所有车辆将拥有的任何通用方法,可能是类似的东西Start()或其他任何东西......https://play.golang.org/p/iPJbFYlo7o稍微扩展一下嵌入的东西......这不是继承。你可以用它完成同样的事情,但是“汽车是一种交通工具”这句话是不正确的。这实际上更像是“Car has a Vehicle”的组合。只是它Vehicle的字段和方法被“提升”了Car,这意味着它们可以从 的实例中访问,Car而无需像Car.Vehicle.FieldOnVehicle. 那不是你真正要找的。如果你想说“Car is a Vehicle”并且它是真的,那么Vehicle需要是一个Car实现的接口。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go