


Warum unterstützt Golang 1.18 Generics die Kovarianz nicht vollst?ndig?
Nov 17, 2024 pm 06:06 PMKovarianz in Golang 1.18-Generika: Ihre Einschr?nkungen verstehen
Die Einführung von Generika in Golang 1.18 brachte viele Fortschritte mit sich, aber bestimmte Einschr?nkungen bleiben bestehen, einschlie?lich das Fehlen einer vollst?ndigen Kovarianzunterstützung.
Das Problem verstehen
Stellen Sie sich ein Szenario vor, in dem Sie eine generische Funktion namens Pipe definieren m?chten, die zwei Funktionen annimmt:
- links: Akzeptiert ein Argument vom Typ A und gibt einen Wert vom Typ T1 zurück.
- rechts: Akzeptiert ein Argument vom Typ T1 und gibt einen Wert vom Typ T2 zurück.
Das Ziel besteht darin, eine Funktion zu erstellen, die die Ausgabe von links als Eingabe für rechts ausführt. Die folgende Implementierung kann jedoch in einigen F?llen nicht kompiliert werden:
func Pipe[A, T1, T2 any](left func(A) T1, right func(T1) T2) func(A) T2 { return func(a A) T2 { return right(left(a)) } }
Dieses Problem tritt auf, weil Golang-Generika die Kovarianz nicht vollst?ndig unterstützen. Kovarianz bedeutet, dass ein Typparameter durch einen Subtyp ersetzt werden kann, ohne den Vertrag zu verletzen. In diesem Fall l?sst T1 keine Untertypen zu, w?hrend io.ReadCloser ein Untertyp von io.Reader ist.
Golangs Designentscheidung
Golangs Entscheidung, Kovarianz nicht vollst?ndig zu implementieren basiert auf Sicherheitsüberlegungen. Das Zulassen von Kovarianz k?nnte zu Situationen führen, in denen Funktionen mit Typen aufgerufen werden, die nicht mit ihren beabsichtigten Signaturen übereinstimmen, was zu undefiniertem Verhalten führt.
FAQ-Erkl?rungen
In den Golang-FAQ hei?t es ausdrücklich dass das aktuelle Verhalten beabsichtigt und kein Fehler ist. Diese Entscheidung zielt darauf ab, unerwartete Laufzeitfehler zu verhindern, die die Anwendungszuverl?ssigkeit beeintr?chtigen k?nnten.
Konvertierbare Typen im Vergleich zu kovarianten Typen
Golang unterstützt zwar keine vollst?ndige Kovarianz, erm?glicht jedoch die Umwandlung eines Typs in einen anderen. Im Fall von func Pipe gibt es jedoch keine M?glichkeit, diese Konvertierung mithilfe von Typparametern darzustellen.
Alternativ k?nnen Sie das Ergebnis von left explizit in den von right ben?tigten Typ umwandeln. Allerdings ist dieser Ansatz zur Kompilierungszeit nicht typsicher, wie im folgenden ge?nderten Code gezeigt:
func Pipe[A, T1, T2, T3 any](left func(A) T1, right func(T2) T3) func(A) T3 { return func(a A) T3 { return right(any(left(a)).(T2)) } }
W?hrend dies die Aufgabe erledigt, opfert es die Sicherheit zur Kompilierungszeit für die Laufzeitkonvertierung.
Das obige ist der detaillierte Inhalt vonWarum unterstützt Golang 1.18 Generics die Kovarianz nicht vollst?ndig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

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

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

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

ToInteGrategolangServicesWithExistingPythoninFrastructure, benutzerdepisorgrpcforinter-serviceCommunication, erlaubtgoandhonAppStoInteractSeamlos-ThroughStandardizedProtocols.1.Userestapis (VICREFRAME-LIKEIGININGOANDOANDOSFLASHINGYTHON) ORGRPC

GolangoffersSuperiorperformance, NativeConcurrencyViagoroutines und efficienionResourceuse, MakingidealforHigh-Travaffic, niedrig-ladencyapis;

Golang wird haupts?chlich für die Back-End-Entwicklung verwendet, kann aber auch eine indirekte Rolle im Front-End-Bereich spielen. Die Konstruktionsziele konzentrieren sich auf leistungsstarke, gleichzeitige Programmierungen und Systeme auf Systemebene und eignen sich zum Erstellen von Back-End-Anwendungen wie API-Servern, Microservices, verteilten Systemen, Datenbankoperationen und CLI-Tools. Obwohl Golang nicht die Mainstream-Sprache für das Web-Front-End ist, kann er über Gopherjs in JavaScript zusammengestellt werden, auf WebAssembly über Tinygo ausgeführt werden oder HTML-Seiten mit einer Vorlagenmotor zur Teilnahme an der Front-End-Entwicklung erzeugen. Die moderne Front-End-Entwicklung muss jedoch noch auf JavaScript/Typecript und sein ?kosystem beruhen. Daher eignet sich Golang besser für die Auswahl der Technologiestapel mit Hochleistungs-Backend als Kern.

ToCompletelyuninstallgolang, FirstDeterMinerehowitwasinstalled (PackageManager, Binary, Quelle usw.), ThenremoveGobinaries und Directories, CleanUpenvironmentvariables und DelemeterelateToolsandcaches.BeginbychinginstallationMethodod: Commonmethododse: Commonmethodod

In der GO -Sprache wird der Kanal für die Kommunikation und Synchronisation zwischen Goroutinen verwendet. Deklarieren Sie die Verwendung von Make -Funktion, wie z. B. CH: = make (chantring), senden

Bei der Begegnung mit einem Fehler "CanfindPackage" liegt dies normalerweise daran, dass Go das Zielpaket oder die Abh?ngigkeit nicht finden kann. Die L?sung lautet wie folgt: 1. überprüfen Sie, ob der Importpfad korrekt ist, und stellen Sie sicher, dass er mit dem Modulpfad oder der Verzeichnisstruktur übereinstimmt. 2. Best?tigen Sie, dass die Datei Go.Mod initialisiert wurde, und verwenden Sie Gomodinit und Gomodtidy, um Abh?ngigkeiten zu verwalten. 3. Führen Sie Goget aus, um fehlende Abh?ngigkeiten herunterzuladen oder den Modul -Cache zu reinigen. 4. Stellen Sie sicher, dass Befehle im richtigen Verzeichniskontext ausgeführt werden, oder geben Sie den vollst?ndigen relativen Pfad für die Konstruktion an.

In Go kann die Verwendung ausgew?hlter Anweisungen nicht blockierende Kanalvorg?nge verarbeiten und Zeitüberschreitungsmechanismen implementieren. Nicht blockierender Empfang oder Senden von Operationen werden über die Standardzweig wie 1. Nicht blockierende Empfang realisiert: Wenn ein Wert vorhanden ist, wird er empfangen und gedruckt, andernfalls wird die Standardzweig sofort ausgeführt. 2. Nicht blockierender Getriebe: Wenn im Kanal kein Empf?nger vorhanden ist, wird das Senden übersprungen. Darüber hinaus kann die Zeitüberschreitungsregelung in Verbindung mit der Zeit implementiert werden. Sie k?nnen auch nicht blockierende und zeitübergreifende Verhaltensweisen kombinieren, versuchen, den Wert sofort zu erhalten und kurz nach dem Ausfall kurze Zeit zu warten, um die gleichzeitigen Reaktionsfunktionen des Programms zu verbessern.

Wenn Sie m?chten, dass das Feld Struktur beim Konvertieren in JSON einen benutzerdefinierten Feldnamen verwendet, k?nnen Sie es über das JSON -Tag des Strukturfeldes implementieren. 1. Verwenden Sie das Tag "Custom_Name" JSON: "Custom_Name", um den Schlüsselnamen des Feldes in JSON anzugeben. Zum Beispiel wird Namestringjson: "Benutzername" das Feld Feldausgang als "Benutzername"; 2. Hinzufügen, OmitEmpty kann steuern, dass die Ausgabe weggelassen wird, wenn das Feld leer ist, wie z.
