Heim >Backend-Entwicklung >Golang >Wie kann ich den Fehler „Variable vom Typ *T kann nicht als Typstringer verwendet werden' in Go Generics beheben?

Wie kann ich den Fehler „Variable vom Typ *T kann nicht als Typstringer verwendet werden' in Go Generics beheben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-20 15:22:10841Durchsuche

How Can I Resolve the

Überlegungen zur Typsicherheit in Generika

In den Generika von Go unterscheidet sich der Typparameter T von der Einschränkungsschnittstelle FooBar. Diese Unterscheidung wirft jedoch eine Frage auf: Wie kann man eine Instanz von T an eine Funktion übergeben, die einen Typ erwartet, der Stringer implementiert (wie es der Fall ist)?

Den Fehler verstehen

Die Fehlermeldung „Variable vom Typ *T kann nicht als Typ-Stringer im zu erledigenden Argument verwendet werden“ deutet darauf hin, dass der Parameter t von blah fälschlicherweise als Typ identifiziert wird, der Stringer implementiert. Allerdings verfügt T nicht von Natur aus über diese Methode.

Lösung des Problems

Um die Konvertierung von t in Stringer zu ermöglichen, sind die folgenden Schritte erforderlich:

  1. Führen Sie die Stringer-Schnittstelle in FooBar ein: Fügen Sie Stringer zur FooBar-Einschränkung hinzu und lassen Sie alle zu Typen, die FooBar erfüllen, um eine Stringer-Methode zu haben.
  2. Ändern Sie die Typen in der Union: Ändern Sie die FooBar-Einschränkung, um Zeiger auf foo oder bar zu akzeptieren, da der Empfängertyp von Stringer ein Zeiger ist .
  3. Zusammengesetzte Literale als Zeiger deklarieren: Da Sie keine zusammengesetzten Literale für Einschränkungen ohne a deklarieren können Kerntyp, Sie müssen t als Zeigertyp deklarieren.
  4. Führen Sie einen Typparameter für FooBar ein: Extrahieren Sie die Typvereinigung von FooBar in einen neuen Typparameter, um sicherzustellen, dass U und T vorhanden sind kompatible Typensätze.

Final Code

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

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

func main() {
    blah[foo]()
}

Erklärung

Wenn nun blah aufgerufen wird, wird eine Variable t vom Typ T als Zeiger deklariert. FooBar[T] schränkt U auf einen Typ ein, der einen Zeiger auf T enthält. Die Konvertierung von &t in U ist gültig und die Methoden von FooBar[T] (einschließlich Stringer) stehen dem Empfänger t zur Verfügung.

Hinweis:

Die Verwendung von Typparametern für FooBar ermöglicht die Übergabe von Argumenten und macht Zwischentricks überflüssig. Beispielsweise könnten Sie blah ändern in:

func blah[T FooBar](t T) {
    do(t)
}

Und es mit blah(&foo{}) aufrufen.

Das obige ist der detaillierte Inhalt vonWie kann ich den Fehler „Variable vom Typ *T kann nicht als Typstringer verwendet werden' in Go Generics beheben?. 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