Eingeschränkte Typen als Funktionsargumente in Go 1.18-Generika
Die Generika von Go 1.18 bieten leistungsstarke Typeinschränkungen, mit denen Entwickler benutzerdefinierte Typen definieren können spezifisches Verhalten. Die Verwendung dieser eingeschränkten Typen als Argumente für Funktionen, die konkrete Typen erwarten, kann jedoch zu Kompilierungsfehlern führen.
Problem:
Betrachten Sie das gegebene Beispiel, in dem die Charmander-Struktur definiert ist als generischer Typ mit einem Typparameter F. Beim Versuch, die Angriffskraft des Charmander zu nutzen, um mithilfe der InflictDamage-Methode Schaden anzurichten, gibt der Compiler einen Fehler aus.
Fehlermeldung:
cannot use c.AttackPower (variable of type float64 constrained by Float) as float64 value in argument to other.ReceiveDamage compiler(IncompatibleAssign)
Dieser Fehler tritt auf, weil die InflictDamage-Methode ein float64-Argument erwartet, die AttackPower-Variable jedoch vom eingeschränkten Typ F ist.
Lösung:
Um diesen Fehler zu beheben, ist die Verwendung von Typkonvertierungen erforderlich. Der eingeschränkte Typ F kann in float64 konvertiert werden, indem sein Wert explizit umgewandelt wird, wie im überarbeiteten Code gezeigt:
func (c *Charmander[T]) ReceiveDamage(damage float64) { c.Health -= T(damage) } func (c *Charmander[T]) InflictDamage(other Pokemon) { other.ReceiveDamage(float64(c.AttackPower)) }
Diese Konvertierungen sind gültig, da float64 sowohl mit float32 als auch mit float64 kompatibel ist, den von der zulässigen Typen Typparameter F. Es ist wichtig zu beachten, dass die explizite Umwandlung von F in float64 zu einem Präzisionsverlust führen kann, wenn F mit float32 instanziiert wird.
Das obige ist der detaillierte Inhalt vonHier sind einige fragenbasierte Titel, die zum Inhalt des Artikels passen: * So verwenden Sie eingeschränkte Typen als Funktionsargumente in Go 1.18 Generics: Dies ist ein direkter und informativer Titel, der das hervorhebt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!