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
WBOYnach vorne
2024-02-05 22:30:031174Durchsuche

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
 }

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()
}

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
}

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)
   ...
}

Sie können ein BaseGameObject definieren:

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

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)
     ...
   })

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen