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 tailMotionSpeed
和 boid
不是 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?
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
FishGameObject
Dann definieren Sie
fish.SetUpdateHandler(func(self GameObject) { fish:=self.(*FishGameObject) ... })
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!