Heim > Backend-Entwicklung > Golang > Erlauben Sie die Verwendung von Verbundwerkstoffen als Funktionsparameter in Strukturen

Erlauben Sie die Verwendung von Verbundwerkstoffen als Funktionsparameter in Strukturen

WBOY
Freigeben: 2024-02-05 22:30:03
nach vorne
1161 Leute haben es durchsucht

Erlauben Sie die Verwendung von Verbundwerkstoffen als Funktionsparameter in Strukturen

Frageninhalt

Nehmen wir an, ich mache so etwas wie eine Spiel-Engine.

Ich benötige eine GameObject-Struktur, um einige Event-Handler zu definieren:

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
 }
Nach dem Login kopieren

Wenn ich dann einige konkrete Spielobjekte initialisiere, möchte ich den Handler als benutzerdefinierte Funktion definieren:

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

Beachten Sie, dass die Mitglieder von tailMotionSpeedboid 不是 GameObject 的成员。它们是 struct FishGameObject, diese Struktur einige benutzerdefinierte Eigenschaften und ein anonymes GameObject hat:

type FishGameObject struct {
    leftFinPosition  float32
    rightFinPosition float32
    tailMotionSpeed  float32
    boid             Boid
    GameObject
}
Nach dem Login kopieren

Wenn ich den Parameter als GameObjectGetter spezifiziere, erhalte ich den Fehler self.tailMotionSpeed undefined(类型 GameObjectGetter 没有字段或方法 tailMotionSpeed),而且我收到错误 cannot use handler(类型为 func(self FishGameObject 的变量) )) 作为结构文字 im Wert von func(self GameObjectGetter) (wenn ich den Parameter als FishGameObject spezifiziere). was mache ich?


Richtige Antwort


Was Sie tun möchten, ist in Go nicht so möglich, wie Sie es tun möchten. Sie können jedoch Folgendes tun:

Definieren Sie GameObject als Schnittstelle:

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

Sie können ein BaseGameObject definieren:

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

Definieren Sie alle Methoden so, dass BaseGameObject 成为 GameObject zu

wird.

FishGameObjectDann definieren Sie

wie Sie es getan haben, aber

fish.SetUpdateHandler(func(self GameObject) {  
    fish:=self.(*FishGameObject)
     ...
   })
Nach dem Login kopieren
Sie sollten für alle Methoden auch Zeigerempfänger verwenden. 🎜

Das obige ist der detaillierte Inhalt vonErlauben Sie die Verwendung von Verbundwerkstoffen als Funktionsparameter in Strukturen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage