Heim  >  Artikel  >  Backend-Entwicklung  >  Wie behandelt man eingeschränkte Typen als Argumente in Go 1.18 Generics?

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

Susan Sarandon
Susan SarandonOriginal
2024-10-27 08:08:31309Durchsuche

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>

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>

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>

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>

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!

Stellungnahme:
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