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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-10-27 07:15:29185Durchsuche

 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>

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)

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>

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>

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!

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