【发布时间】:2015-06-11 21:56:01
【问题描述】:
我正在用 Go 编写一个简单的游戏,但遇到了一些问题。我的,切断,代码如下所示:
package main
import "fmt"
type Location struct {
X int
Y int
}
type Car struct {
MaxSpeed int
Loc Location
}
func (car Car) SetLocation(loc Location) {
car.Loc = loc
}
func (car Car) GetLocation() Location {
return car.Loc
}
type Bike struct {
GearsNum int
Loc Location
}
func (bike Bike) SetLocation(loc Location) {
bike.Loc = loc
}
func (bike Bike) GetLocation() Location {
return bike.Loc
}
type Movable interface {
GetLocation() Location
SetLocation(Location)
}
type Fleet struct {
vehicles []Movable
}
func (fleet *Fleet) AddVehicles(v ...Movable) {
for _, x := range(v) {
fleet.vehicles = append(fleet.vehicles, x)
}
}
func (fleet *Fleet) WherTheyAre() {
for _, v := range(fleet.vehicles) {
fmt.Println(v.GetLocation())
}
}
func main() {
myCar := Car{MaxSpeed: 200, Loc: Location{12, 34}}
myBike := Bike{GearsNum: 11, Loc: Location{1, 1}}
myFleet := Fleet{}
myFleet.AddVehicles(myCar)
myFleet.AddVehicles(myBike)
myFleet.WherTheyAre()
myCar.SetLocation(Location{0,0})
myFleet.WherTheyAre()
}
假设 Car 和 Bike 是我不想复制的非常大的结构。我应该如何设计代码才能修改作为车队一部分的汽车的位置?换句话说,如何设计 Fleet 结构以能够修改其可移动对象? 我曾尝试尝试使用指向接口的指针,但我不是个好主意...
感谢您的帮助!
【问题讨论】:
-
Car和Bike上的方法需要指针接收器,而不是值接收器。 -
这不是重点。我在问如何拥有一个“处理程序”,通过它我将能够修改 Fleet 中的车辆。 Func: AddVehicles 将复制它,我无法将其参数类型更改为指针,因为类型是接口。
-
只需将指针传递给
AddVehicles:myFleet.AddVehicles(&myCar); myFleet.AddVehicles(&myBike);您不必(也不应该)将vehicles []Movable更改为vehicles []*Movable。 -
它有效...谢谢。但我的心只是炸了。如果类型不正确,它如何工作?