


Warum erfüllt mein generischer Go-Typparameter nicht die „Stringer'-Schnittstelle?
Generische Typeinschränkungen in Go verstehen
In Go 1.18 bieten Generika ein leistungsstarkes Werkzeug zur Verbesserung der Codeflexibilität. Beim Arbeiten mit Typeinschränkungen ist es jedoch wichtig zu verstehen, warum bestimmte Fehler auftreten können.
Das Problem
Berücksichtigen Sie den folgenden Code:
type stringer interface { a() string } func do(s stringer) { fmt.Println(s.a()) } func blah[T FooBar]() { t := &T{} do(t) } func main() { blah[foo]() }
Beim Kompilierungsversuch Wenn Sie diesen Code verwenden, tritt möglicherweise der Fehler auf:
cannot use t (variable of type *T) as type stringer in argument to do: *T does not implement stringer (type *T is pointer to type parameter, not type parameter)
Den Fehler verstehen
Dieser Fehler beruht auf einem Missverständnis darüber, wie generische Typbeschränkungen funktionieren. Die Einschränkung FooBar in der Blah-Funktion ist ein Platzhalter für Typen, die die Schnittstelle FooBar erfüllen. Die Variable t ist jedoch vom Typ T, was ein Zeiger auf den Typparameter T ist. Dies bedeutet, dass T selbst kein Typparameter ist und daher die Stringer-Schnittstelle nicht erfüllen kann.
Die Lösung
Die Lösung für dieses Problem besteht darin, eine Beziehung zwischen dem Typparameter T und der Stringer-Schnittstelle einzuführen. Es gibt zwei mögliche Ansätze:
1. Explizite Behauptung
Sie können mithilfe der Any-Type-Konvertierung explizit behaupten, dass *T die Stringer-Schnittstelle erfüllt:
func blah[T FooBar]() { t := &T{} do(any(t).(stringer)) }
2. Typzusammensetzung
Alternativ können Sie einen neuen Typ definieren, der die Einschränkungen von FooBar und Stringer kombiniert:
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar[T]]() { var t T do(U(&t)) }
Dieser Ansatz gewährleistet die Typsicherheit durch Einbetten von Stringer in die FooBar-Schnittstelle und erfordert, dass T ein Zeigertyp ist, um die Einschränkung zu erfüllen FooBar.
Fazit
Das Verständnis der Beziehung zwischen Typbeschränkungen und Typparametern ist entscheidend für die effektive Arbeit mit Generika in Go. Durch die Einführung einer Beziehung zwischen T und Stringer, entweder durch explizite Behauptung oder Typkomposition, können Sie den Fehler beheben und das gewünschte Verhalten aktivieren.
Das obige ist der detaillierte Inhalt vonWarum erfüllt mein generischer Go-Typparameter nicht die „Stringer'-Schnittstelle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Wie kann man im Beegoorm -Framework die mit dem Modell zugeordnete Datenbank angeben? In vielen BeEGO -Projekten müssen mehrere Datenbanken gleichzeitig betrieben werden. Bei Verwendung von BeEGO ...

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...
