Let's say I'm making something like a game engine.
I need an GameObject struct which defines some event handlers:
type GameObject struct {
transform Transform
animatedMesh AnimatedMesh
updateHandler func(self GameObjectGetter)
onCreateHandler func(self GameObjectGetter)
onDestroyHandler func(self GameObjectGetter)
}
func (g GameObject)getGameObject() GameObject {
return g
}
type GameObjectGetter interface {
getGameObject() GameObject
}
Then, when I'm initializing some concrete GameObject, I want to define a handler as a custom function:
g.updateHandler = func(self FishGameObject) { // Error here
self.tailMotionSpeed = self.boid.acceleration.Normalize().Len()
}
Note here that tailMotionSpeed and boid aren't members of GameObject. They're members of struct FishGameObject which has some custom properties and anonymous GameObject:
type FishGameObject struct {
leftFinPosition float32
rightFinPosition float32
tailMotionSpeed float32
boid Boid
GameObject
}
I'm getting an error self.tailMotionSpeed undefined (type GameObjectGetter has no field or method tailMotionSpeed) if I specify argument as GameObjectGetter, and also I'm getting an error cannot use handler (variable of type func(self FishGameObject)) as func(self GameObjectGetter) value in struct literal if I specify argument as FishGameObject. What do I do?
What you are trying to do is not possible in Go in the way you are trying to do. However, you can do this:
Define
GameObjectas an interface:The you can define a
BaseGameObject:Define all the methods so
BaseGameObjectis aGameObject.Then, define
FishGameObjectas you did, butYou also should use pointer receivers for all the methods.