Wie kann ich eingeschränkte Typen als Argumente in Go-Funktionen verwenden, wenn diese konkrete Typen erwarten?

Patricia Arquette
Freigeben: 2024-10-27 07:15:29
Original
209 Leute haben es durchsucht

 How Can I Use Constrained Types as Arguments in Go Functions When They Expect Concrete Types?

Verwendung eingeschränkter Typen als Argumente in Go 1.18 Generics

In Go 1.18 haben Generics die Möglichkeit eingeführt, Typparameter einzuschränken, was eine größere Flexibilität und Typsicherheit ermöglicht. Wenn jedoch eingeschränkte Typen als Argumente für Funktionen verwendet werden, die konkrete Typen erwarten, kann es zu unerwartetem Verhalten kommen.

Betrachten Sie das folgende Beispiel, in dem wir eine Pokemon-Schnittstelle und eine Charmander-Struktur mit einem auf Float (float32) beschränkten Typparameter definieren oder float64):

<code class="go">type Pokemon interface {
    ReceiveDamage(float64)
    InflictDamage(Pokemon)
}

type Float interface {
    float32 | float64
}

type Charmander[F Float] struct {
    Health      F
    AttackPower F
}</code>
Nach dem Login kopieren

Unser Ziel ist es, das AttackPower-Feld von Charmander zu nutzen, um Schaden in der InflictDamage-Methode zu verursachen. Bei der Implementierung dieser Methode tritt jedoch der folgende Fehler auf:

cannot use c.AttackPower (variable of type float64 constrained by Float) as float64 value in argument to other.ReceiveDamage compiler(IncompatibleAssign)
Nach dem Login kopieren

Dieser Fehler tritt auf, weil das AttackPower-Feld trotz der Instanziierung der Charmander-Struktur als *Charmander[float64] immer noch vom Typ F ist auf Float beschränkt. In diesem Zusammenhang umfasst Float sowohl float32 als auch float64, und der Compiler kann nicht automatisch zwischen ihnen konvertieren.

Um dieses Problem zu beheben, müssen wir das AttackPower-Feld explizit in float64 konvertieren, den erwarteten Typ für other.ReceiveDamage Methodenargument:

<code class="go">func (c *Charmander[T]) InflictDamage(other Pokemon) {
    other.ReceiveDamage(float64(c.AttackPower))
}</code>
Nach dem Login kopieren

Diese Konvertierung stellt sicher, dass der Wert von AttackPower korrekt an die andere.ReceiveDamage-Methode übergeben wird. Darüber hinaus müssen wir den Schadensparameter in der Methode „ReceiveDamage“ in den Typ F konvertieren, um die Typkonsistenz aufrechtzuerhalten:

<code class="go">func (c *Charmander[T]) ReceiveDamage(damage float64) {
    c.Health -= T(damage)
}</code>
Nach dem Login kopieren

Durch die Implementierung dieser Typkonvertierungen können wir eingeschränkte Typen als Argumente für Funktionen verwenden, die konkrete Typen erwarten Aufrechterhaltung der Typsicherheit und Vermeidung von Compilerfehlern. Es ist wichtig zu beachten, dass Typkonvertierungen bei der Konvertierung zwischen verschiedenen Float-Typen zu Präzisionsverlusten führen können.

Das obige ist der detaillierte Inhalt vonWie kann ich eingeschränkte Typen als Argumente in Go-Funktionen verwenden, wenn diese konkrete Typen erwarten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!