Abrufen des Reflect.Kind eines Typs basierend auf einem primitiven Typ
In Go können Sie das Reflect-Paket verwenden, um die Struktur zu überprüfen von Typen und Werten. Allerdings kann es eine Herausforderung sein, den „reflect.Kind“ eines Typs zu bestimmen, der eine Schnittstelle implementiert, aber auf einem primitiven Typ basiert.
Betrachten Sie das folgende Beispiel:
type ID interface { myid() } type id string func (id) myid() {}
Hier der ID-Typ implementiert die ID-Schnittstelle, ihre Implementierung basiert jedoch auf dem primitiven Typ string. Wenn Sie versuchen, die Reflect.Kind-ID mithilfe von Reflect.TypeOf(id).Kind() abzurufen, wird Reflect.String anstelle von Reflect.Interface zurückgegeben.
Um dieses Problem zu beheben, müssen Sie bestehen ein Zeiger auf den Schnittstellenwert anstelle des Werts selbst. Der Grund dafür ist, dass Reflect.TypeOf() Schnittstellenwerte erwartet, aber wenn ein Nicht-Schnittstellenwert übergeben wird, wird er implizit in eine Schnittstelle{} eingeschlossen.
Hier ist ein Beispiel:
id := ID(id("test")) fmt.Println(id) t := reflect.TypeOf(&id).Elem() fmt.Println(t) fmt.Println(t.Kind())
Die Ausgabe ist:
test main.ID interface
In diesem Fall gibt Reflect.TypeOf(&id) einen Zeiger auf den Schnittstellenwert zurück, der dann ist „ausgepackt“ mit t := reflektieren.TypeOf(&id).Elem(). Das resultierende t ist der Typdeskriptor der ID-Schnittstelle, und seine Kind()-Methode gibt „reflect.Interface“ zurück.
Dieser Ansatz kann verwendet werden, um den „reflect.Kind“ eines beliebigen Typs abzurufen, der beim Aufruf „reflect.Interfaces“ zurückgibt Kind(), auch wenn es auf einem primitiven Typ basiert.
Das obige ist der detaillierte Inhalt vonWie erhalte ich das richtige Reflect.Kind eines primitiven Typs bei der Implementierung einer Schnittstelle in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!