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