Heim > Artikel > Backend-Entwicklung > Warum erhalte ich die Meldung „Typ *T ist Zeiger auf Typparameter, nicht Typparameter“, wenn ich Generics in Go verwende?
Bei der Verwendung von Generics in Go ist es wichtig, zwischen einem Typparameter und seiner Einschränkung zu unterscheiden. Ein Typparameter wird durch einen Großbuchstaben wie z. B. T gekennzeichnet, während eine Einschränkung ein Schnittstellentyp ist, der das vom Typparameter geforderte Verhalten definiert. Zum Beispiel:
<code class="go">type GS interface { Id() string SetId(string) }</code>
In diesem Fall ist GS die Einschränkung, die angibt, dass ein Typ, der GS implementiert, über die Methoden Id() und SetId() mit bestimmten Signaturen verfügen muss.
Bei der Verwendung eines Typparameters wie T in Generika ist es wichtig zu verstehen, dass *T sich von T unterscheidet. *T stellt einen Zeiger auf den Typparameter T dar.
In Ihrem Beispiel ist der aufgetretene Fehler:
type *T is pointer to type parameter, not type parameter
Dieser Fehler tritt auf, wenn versucht wird, eine Zeigermethode (in diesem Fall SetId()) für den Typparameter (T ). Zeigermethoden sind jedoch nur für den Zeiger auf den Typparameter (*T) und nicht für den Typparameter verfügbar.
Um dieses Problem zu beheben, müssen Sie dies explizit tun Geben Sie die Einschränkung für den Zeiger auf den Typparameter an. Dies kann durch Hinzufügen einer zusätzlichen Einschränkung erreicht werden:
<code class="go">type GS interface { Id() string SetId(string) } type PT interface { *GS }</code>
Jetzt können Sie PT als Einschränkung für MyStore verwenden:
<code class="go">type MyStore[T PT] struct { values map[string]T }</code>
Ändern der Vorkommen von *T in T im MyStore Struktur- und Methodendefinition sind ebenfalls erforderlich.
Die Fehlermeldung zeigt auch an, dass der Typ A die GS-Schnittstelle nicht implementiert, da die SetId()-Methode in A eine hat Zeigerempfänger. Um dies zu beheben, müssen Sie sicherstellen, dass der A-Typ die GS-Schnittstelle korrekt implementiert:
<code class="go">func (a *A) SetId(id string) { a.ID = id }</code>
Mit diesen Änderungen sollte der Code erfolgreich kompiliert werden.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich die Meldung „Typ *T ist Zeiger auf Typparameter, nicht Typparameter“, wenn ich Generics in Go verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!