Maison > développement back-end > Golang > Autoriser l'utilisation de composites comme paramètres de fonction dans les structures

Autoriser l'utilisation de composites comme paramètres de fonction dans les structures

WBOY
Libérer: 2024-02-05 22:30:03
avant
1161 Les gens l'ont consulté

Autoriser lutilisation de composites comme paramètres de fonction dans les structures

Contenu de la question

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
 }
Copier après la connexion

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()
}
Copier après la connexion

Notez que les membres de tailMotionSpeedboid 不是 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
}
Copier après la connexion

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?


Bonne réponse


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)
   ...
}
Copier après la connexion

Vous pouvez définir un BaseGameObject : 

type BaseGameObject struct {
    transform        Transform
    animatedMesh     AnimatedMesh
    updateHandler    func(GameObject)
    onCreateHandler  func(GameObject)
    onDestroyHandler func(GameObject) 
}
Copier après la connexion

Définissez toutes les méthodes telles que BaseGameObject 成为 GameObject devienne

.

FishGameObjectEnsuite, définissez

comme vous l'avez fait, mais

fish.SetUpdateHandler(func(self GameObject) {  
    fish:=self.(*FishGameObject)
     ...
   })
Copier après la connexion
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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal