Heim  >  Artikel  >  Backend-Entwicklung  >  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
Patricia ArquetteOriginal
2024-11-05 12:53:02640Durchsuche

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>

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

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>

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.

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>

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!

Stellungnahme:
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