Heim > Backend-Entwicklung > Golang > Warum kann ich in Go Generics keine Variable vom Typ „*T' als „Stringer' verwenden?

Warum kann ich in Go Generics keine Variable vom Typ „*T' als „Stringer' verwenden?

Mary-Kate Olsen
Freigeben: 2024-12-13 01:58:10
Original
918 Leute haben es durchsucht

Why Can't I Use a `*T` Type Variable as a `Stringer` in Go Generics?

Verstehen des Fehlers „Variable vom Typ *T kann nicht als Typzeichenfolge im Argument verwendet werden“ in Go Generics

Im bereitgestellten Codeausschnitt Sie versuchen, generisch eine Funktion aufzurufen, die einen Parameter vom Typ stringer erwartet, aber Sie übergeben einen Zeiger auf einen Typparameter T stattdessen.

Der Go-Compiler löst einen Fehler aus, weil:

  • Typidentität und Parameter: T ist nicht von Natur aus äquivalent zu seiner Einschränkung FooBar. Daher ist *T nicht dasselbe wie *FooBar oder *bar.
  • Fehlende Methode: Die Stringer-Schnittstelle erfordert eine Methode namens a(). Derzeit implementieren Ihre foo- und bar-Typen diese Methode auf Zeigerempfängern, aber *T verfügt nicht von Natur aus über diese Methode.

Behebung des Problems

Es gibt sie Zwei Hauptansätze zur Lösung dieses Problems:

1. Stellen Sie Typsicherheit mit Typzusicherung sicher (weniger optimal)

  • Stellen Sie sicher, dass *T einen Stringer mithilfe von any(t).(stringer) innerhalb der do-Funktion implementiert.
  • Dieser Ansatz kann zu Panik führen, wenn T Stringer nicht tatsächlich implementiert.

2. Einschränkung neu definieren und Generics anpassen (bevorzugt)

  • Stringer als Einschränkung zur FooBar-Schnittstelle hinzufügen.
  • Verwenden Sie Zeigerempfänger für die Typen foo und bar, um sie an der Einschränkung auszurichten .
  • Führen Sie einen zweiten Typparameter ein, der die Einschränkung innerhalb der FooBar angibt Schnittstelle.
  • Übergeben Sie eine Instanz des eingeschränkten Typs als Argument an blah.

Überarbeiteter Code:

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar[T]]() {
    var t T
    do(U(&t))
}

func main() {
    blah[foo]()
}
Nach dem Login kopieren

In diesem überarbeiteter Code:

  • Die FooBar-Schnittstelle enthält Stringer als Einschränkung.
  • Die Typen foo und bar haben Zeigerempfänger für ihre a()-Methoden.
  • U wird durch FooBar[T] eingeschränkt, wodurch sichergestellt wird, dass es sowohl die FooBar- als auch die Stringer-Einschränkungen erfüllt.
  • blah benötigt ein Argument vom Typ U, das eine Instanz der eingeschränkten FooBar-Schnittstelle ist.

Das obige ist der detaillierte Inhalt vonWarum kann ich in Go Generics keine Variable vom Typ „*T' als „Stringer' verwenden?. 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