首頁 >後端開發 >Golang >允許在結構中使用複合作為函數參數

允許在結構中使用複合作為函數參數

WBOY
WBOY轉載
2024-02-05 22:30:031158瀏覽

允許在結構中使用複合作為函數參數

問題內容

假設我正在製作類似遊戲引擎的東西。

我需要一個 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()
}

請注意,tailMotionSpeedboid 不是 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除