为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
有只小跳蛙 2021-11-22 18:26:49
如果你想象我有以下声明: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 的新手
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

Vehicle被嵌入CarBus,所以你得到的东西在错误的方向前进......这不像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实现的接口。


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信