In Go kann die Definition einer generischen Schnittstelle mit Typparametern dazu führen Rückschlussprobleme bei der Implementierung und Verwendung. In diesem Artikel wird der Fehler „V kann nicht abgeleitet werden: Typparameter aus Einschränkungsimplementierung ableiten“ in solchen Szenarios behoben.
Betrachten Sie eine Schnittstelle ConfigStorage mit den Typparametern K und V, wobei V WritableType erweitert . Eine Dateisystemspeicherimplementierung dieser Schnittstelle, FileSystemStorage, ist definiert. Beim Versuch, die generische Funktion GetValue zu verwenden, tritt jedoch ein Kompilierungsfehler auf, da der Typ von V nicht abgeleitet werden kann.
Go 1.21 und höher:
Das Problem wurde in Go 1.21 und höher behoben, da die Typinferenz erweitert wurde, um Methodensignaturen in Schnittstellen zu berücksichtigen. Typargumente für Typparameter in Methodensignaturen können aus übereinstimmenden Parametern in den entsprechenden Methoden abgeleitet werden.
So verwenden Sie GetValue ohne Angabe von Typeinschränkungen:
result, _ = GetValue(fileStorage, "key")
Go 1.20 und niedriger:
Für frühere Go-Versionen wird die Schlussfolgerung von V aus dem Typ, der die Einschränkung implementiert, nicht unterstützt. Beim Aufruf von GetValue müssen explizite Typparameter angegeben werden:
GetValue[string, string](fileStorage, "key")
Der Fehler tritt auf, weil die Funktion GetValue versucht, den Typ von V aus den bereitgestellten Argumenten abzuleiten: ihrem ersten Argument, dem Speicher und sein zweites Argument, key. Diese Argumente allein liefern jedoch keine ausreichenden Informationen zur Bestimmung von V, da Speicher ein Schnittstellenwert ist, der mehrere Typen implementieren kann.
Durch die explizite Angabe der Typparameter wird die Mehrdeutigkeit für den Compiler beseitigt. Dadurch kann der Typinferenzalgorithmus anhand der bereitgestellten Argumente den richtigen Typ von V ableiten.
Das obige ist der detaillierte Inhalt vonWie kann in Go Generic Interfaces die Meldung „V: Typparameter kann nicht aus der Einschränkungsimplementierung abgeleitet werden' behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!