Heim > Backend-Entwicklung > Golang > Warum erhalte ich die Meldung „Typ *T ist Zeiger auf Typparameter, nicht Typparameter', wenn ich Generics in Go verwende?

Warum erhalte ich die Meldung „Typ *T ist Zeiger auf Typparameter, nicht Typparameter', wenn ich Generics in Go verwende?

Patricia Arquette
Freigeben: 2024-11-05 12:53:02
Original
765 Leute haben es durchsucht

Why Do I Get

Gehen Sie mit Generics: Typ *T ist ein Zeiger auf Typparameter, nicht auf Typparameter

Typparameter und Einschränkungen verstehen

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>
Nach dem Login kopieren

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.

Typ * T vs. Typparameter

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.

Fehlererklärung

In Ihrem Beispiel ist der aufgetretene Fehler:

type *T is pointer to type parameter, not type parameter
Nach dem Login kopieren

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.

Problem lösen

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Ändern der Vorkommen von *T in T im MyStore Struktur- und Methodendefinition sind ebenfalls erforderlich.

Implementierung der Einschränkung

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage