Arrays 具有相同匿名字段但类型不同的Go结构数组
如果您认为我有以下声明:Arrays 具有相同匿名字段但类型不同的Go结构数组,arrays,data-structures,struct,go,Arrays,Data Structures,Struct,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 Num
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
我正试图拥有一系列的车辆。但是,这是不可能的,因为它们都有不同的类型(即汽车
,公共汽车
,自行车
,等等)
你是如何做到这一点的。还是我试图从错误的角度来解决这个问题。我是新手。
车辆
嵌入在汽车
和公交车
中,所以你把事情搞砸了。。。这不像Vehicle
是一个父类,所以你不能从这个设计中获得你想要的多态行为。您需要的是一个接口
为了向您展示一个工作示例,我将使用空接口(它将允许您在集合中存储任何类型)。对于您的实际程序,您可能希望制作一个类似于IVehicle
的界面,并在其上放置所有车辆都具有的任何常用方法,可能类似于Start()
或其他什么
把嵌入的东西扩展一点。。。这不是继承。你可以用它完成同样的事情,但是“汽车就是一辆车”的说法是不正确的。这实际上更像是“车有车”的构图。只是
Vehicle
的字段和方法被“提升”到Car
,这意味着它们可以从Car
的实例访问,而无需像Car.Vehicle.FieldOnVehicle
这样的间接层。那不是你真正想要的。如果你想说“汽车是一辆汽车”并且这是真的,那么Vehicle
需要是一个Car
实现的接口。Go没有继承性,因此以这种方式处理问题通常是错误的选择。另外,您不能这样做的原因是没有泛型,并且go类型是不变的。请使用接口。现在找不到,但此主题有多个副本。嗯,车辆可以是一种类型。但他也需要一个所有车辆都可以使用的接口,如启动、移动、关闭等。。。这将允许他将车辆嵌入其他类型中,并将它们存储在实现IVehicle或其他任何类型的数组中,对吗?@Saarrr是的,如果不清楚的话,很抱歉。我在第二段中使用了I车辆
,因为如果他保留车辆
类型,这将是明智的选择。在最后一段中,我将讨论他的当前实现,并试图给出一些关于嵌入的更广泛的概念信息。“是一个”、“有一个”是我记得学者们解释它的方式;)我就是这么想的,只是为了确保我自己的理解没有被打得一塌糊涂。谢谢,回答得很好。不确定in是否需要后续问题,但如何确保数据结构正确编码为JSON
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])
}