假設我正在製作類似遊戲引擎的東西。
我需要一個 GameObject 結構來定義一些事件處理程序:
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 }
然後,當我初始化一些特定的遊戲物件時,我想將處理程序定義為自訂函數:
g.updateHandler = func(self FishGameObject) { // Error here self.tailMotionSpeed = self.boid.acceleration.Normalize().Len() }
請注意,tailMotionSpeed
和 boid
不是 GameObject 的成員。它們是 struct FishGameObject
的成員,該結構具有一些自訂屬性和匿名 GameObject:
type FishGameObject struct { leftFinPosition float32 rightFinPosition float32 tailMotionSpeed float32 boid Boid GameObject }
如果我將參數指定為GameObjectGetter,我收到錯誤self.tailMotionSpeed undefined(類型GameObjectGetter 沒有欄位或方法tailMotionSpeed)
,而且我收到錯誤cannot use handler(類型為func (self FishGameObject 的變數) )) 作為結構文字
中的func(self GameObjectGetter) 值(如果我將參數指定為FishGameObject)。我該怎麼辦?
你想要做的事情在 Go 中不可能以你想要做的方式實現。但是,您可以這樣做:
將 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) ... })
您也應該為所有方法使用指標接收器。
以上是允許在結構中使用複合作為函數參數的詳細內容。更多資訊請關注PHP中文網其他相關文章!