比方说,我正在制作一个类似游戏引擎的东西.

我需要一个GameObject struct ,它定义了一些事件处理程序:

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
 }

然后,当我初始化一些具体的GameObject时,我想将一个处理程序定义为一个定制函数:

g.updateHandler = func(self FishGameObject) {  // Error here
    self.tailMotionSpeed = self.boid.acceleration.Normalize().Len()
}

请注意,tailMotionSpeedboid不是GameObject的成员.它们是 struct FishGameObject的成员, struct FishGameObject具有一些自定义属性和匿名游戏对象:

type FishGameObject struct {
    leftFinPosition  float32
    rightFinPosition float32
    tailMotionSpeed  float32
    boid             Boid
    GameObject
}

如果我将参数指定为GameObjectGetter,我会得到一个错误self.tailMotionSpeed undefined (type GameObjectGetter has no field or method tailMotionSpeed),如果我将参数指定为FishGameObject,我也会得到一个错误cannot use handler (variable of type func(self FishGameObject)) as func(self GameObjectGetter) value in struct literal.我做什么好?

推荐答案

你想做的事情在你想做的事情中是不可能的.但是,您可以执行以下操作:

GameObject定义为接口:

type GameObject interface {
   GetTransform() *Transform
   GetAnimatedMesh() *AnimatedMesh
   SetUpdateHandler(func(GameObject))
   UpdateHandler() func(GameObject)
   ...
}

您可以定义BaseGameObject:

type BaseGameObject struct {
    transform        Transform
    animatedMesh     AnimatedMesh
    updateHandler    func(GameObject)
    onCreateHandler  func(GameObject)
    onDestroyHandler func(GameObject) 
}

定义所有的方法,这样BaseGameObject就是GameObject.

然后,像你一样定义FishGameObject,但是

fish.SetUpdateHandler(func(self GameObject) {  
    fish:=self.(*FishGameObject)
     ...
   })

您还应该为所有方法使用指针接收器.

Go相关问答推荐

Go汇编器命名为Constants

Golang ==错误:OCI运行时创建失败:无法启动容器进程:exec:./" bin:stat./" bin:没有这样的文件或目录:未知

AWS S3 SelectObjectContent在AWS SDK v2 for Go中不返回结果

减少在围棋中映射DTO时的重复代码量

在Mac中使用uname获取处理器体系 struct 时,在为AMD64构建Go二进制时出现错误结果

go aws-lambda 与 terraform 中的 exec 格式错误

在 go 中,将接收器 struct 从值更改为指针是否向后兼容?

为什么docall在singleflight中使用go panic?

Neptune 在连接到启用 IAM 的 Neptune 实例时抛出握手错误错误

将值发送到 Channel 并在就绪时读取输出

Go 泛型:自引用接口约束

转到文本/模板模板:如何根据模板本身的值数组判断值?

关系不存在 GORM

将未知长度切片的值分配给Go中的 struct ?

在 Go 中将十六进制转换为带符号的 Int

从 Go struct 中提取标签作为 reflect.Value

gob 解码器仅返回数组中的第一个元素

Go 泛型是否与 LINQ to Objects 等效?

带有 *s3.S3 对象的 Golang 单元测试

并发 map map导致的 Golang 数据竞争