Heim >Backend-Entwicklung >Golang >Wie erhalte ich eine Reflect.Interface-Art für einen Go-Typ basierend auf einem primitiven Typ?

Wie erhalte ich eine Reflect.Interface-Art für einen Go-Typ basierend auf einem primitiven Typ?

Barbara Streisand
Barbara StreisandOriginal
2024-12-25 08:43:09569Durchsuche

How to Get reflect.Interface Kind for a Go Type Based on a Primitive Type?

So erhalten Sie die Reflect.Interface-Art für einen Typ basierend auf einem primitiven Typ

In Go, wenn Sie mit Typen arbeiten, die Schnittstellen implementieren Wenn Sie sich bei der Implementierung jedoch auf primitive Typen verlassen, ist es notwendig, den Reflect.Kind als Reflect.Interface zu erhalten. Dieser Artikel befasst sich mit diesem Bedarf und bietet eine Lösung.

Das Problem

Stellen Sie sich die folgende Situation vor:

type ID interface {
    myid()
}

type id string

func (id) myid() {}

Hier ist ID eine Schnittstelle implementiert durch id, die ein String ist. Wenn wir „reflect.TypeOf(id)“ verwenden, um den Typdeskriptor zu erhalten, ist das Ergebnis nicht das gewünschte „reflect.Interface“, sondern ein „reflect.String“.

Die Lösung

Um dieses Problem zu umgehen, ist es notwendig, einen Zeiger auf den Schnittstellenwert anstelle des Werts selbst an Reflect.TypeOf() zu übergeben. Dies verhindert das implizite Umschließen des Werts in einer Schnittstelle{}.

id := ID(id("test"))

t := reflect.TypeOf(&id).Elem()
fmt.Println(t.Kind()) // Output: "interface"

In diesem Beispiel gibt Reflect.TypeOf(&id) einen Zeiger auf den Schnittstellenwert zurück, der dann mit Elem() entpackt wird Erhalten Sie den Typdeskriptor der Schnittstelle selbst. Dieser Ansatz stellt die gewünschte Reflect.Interface-Art bereit.

Zusätzlicher Hinweis

Die gleiche Technik kann verwendet werden, um jede Art von Reflect.Type zu erhalten, die Reflect.Interface zurückgibt, wenn Aufruf von Kind(). Übergeben Sie einfach einen Zeiger auf den Wert oder Typ, der reflektiert werden soll.TypeOf().

Das obige ist der detaillierte Inhalt vonWie erhalte ich eine Reflect.Interface-Art für einen Go-Typ basierend auf einem primitiven Typ?. 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