Wie behandelt man eingeschränkte Typen als Argumente in Go 1.18 Generics?

Susan Sarandon
Freigeben: 2024-10-27 08:08:31
Original
312 Leute haben es durchsucht

How to Handle Constrained Types as Arguments in Go 1.18 Generics?

Eingeschränkte Typen als Argumente in Go 1.18 verwenden

In Go 1.18-Generika ermöglichen eingeschränkte Typen Entwicklern, benutzerdefinierte Datentypen mit angegebenen Einschränkungen zu definieren. Wenn jedoch eingeschränkte Typen als Argumente für Funktionen verwendet werden, die konkrete Typen erwarten, ist eine Typkonvertierung erforderlich.

Betrachten Sie das folgende Beispiel:

<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

Hier implementiert Charmander die Pokemon-Schnittstelle mit einem Generikum Typparameter F, der entweder mit float32 oder float64 instanziiert werden kann. Versuche, AttackPower (einen eingeschränkten Typ) als float64-Argument in other.ReceiveDamage() zu verwenden, führen jedoch zu einem Fehler:

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

Typkonvertierung für Kompatibilität

Um dieses Problem zu beheben, muss eine Typkonvertierung verwendet werden, um die Kompatibilität zwischen dem eingeschränkten Typ und dem von der Funktion erwarteten konkreten Typ sicherzustellen. Dies liegt daran, dass F nicht äquivalent zu float64 ist, selbst wenn es auf float64 beschränkt ist.

Der korrigierte Code wird:

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

In ähnlicher Weise wird die Methode „ReceiveDamage()“ geändert, um einen eingeschränkten Typ zu verarbeiten ( Gesundheit) durch Konvertieren des Schadensarguments in den eingeschränkten Typ:

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

Präzisionsüberlegungen

Es ist wichtig zu beachten, dass die Konvertierung von float64 in float32 (wenn F wird mit float32 instanziiert) kann zu Präzisionsverlusten führen. Dies muss möglicherweise in bestimmten Anwendungsfällen berücksichtigt werden.

Das obige ist der detaillierte Inhalt vonWie behandelt man eingeschränkte Typen als Argumente in Go 1.18 Generics?. 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!