Maison >développement back-end >Golang >Autoriser l'utilisation de composites comme paramètres de fonction dans les structures
Disons que je crée quelque chose comme un moteur de jeu.
J'ai besoin d'une structure GameObject pour définir certains gestionnaires d'événements :
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 }
Ensuite, lorsque j'initialise des objets de jeu concrets, je souhaite définir le gestionnaire comme une fonction personnalisée :
g.updateHandler = func(self FishGameObject) { // Error here self.tailMotionSpeed = self.boid.acceleration.Normalize().Len() }
Notez que les membres de tailMotionSpeed
和 boid
不是 GameObject 的成员。它们是 struct FishGameObject
, cette structure possède des propriétés personnalisées et un GameObject anonyme :
type FishGameObject struct { leftFinPosition float32 rightFinPosition float32 tailMotionSpeed float32 boid Boid GameObject }
Si je spécifie le paramètre comme GameObjectGetter, j'obtiens l'erreur self.tailMotionSpeed undefined(类型 GameObjectGetter 没有字段或方法 tailMotionSpeed)
,而且我收到错误 cannot use handler(类型为 func(self FishGameObject 的变量) )) 作为结构文字
dans la valeur func(self GameObjectGetter) (si je spécifie le paramètre comme FishGameObject). que dois-je faire?
Ce que vous voulez faire n'est pas possible dans Go comme vous voulez le faire. Cependant, vous pouvez faire ceci :
Définir GameObject
comme interface :
type GameObject interface { GetTransform() *Transform GetAnimatedMesh() *AnimatedMesh SetUpdateHandler(func(GameObject)) UpdateHandler() func(GameObject) ... }
Vous pouvez définir un BaseGameObject
:
type BaseGameObject struct { transform Transform animatedMesh AnimatedMesh updateHandler func(GameObject) onCreateHandler func(GameObject) onDestroyHandler func(GameObject) }
Définissez toutes les méthodes telles que BaseGameObject
成为 GameObject
devienne
FishGameObject
Ensuite, définissez
fish.SetUpdateHandler(func(self GameObject) { fish:=self.(*FishGameObject) ... })Vous devez également utiliser des récepteurs pointeurs pour toutes les méthodes. 🎜
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!