Heim > Backend-Entwicklung > Golang > Warum kann ich mithilfe von Reflection den Namen eines Go-Methodenparameters nicht abrufen?

Warum kann ich mithilfe von Reflection den Namen eines Go-Methodenparameters nicht abrufen?

Susan Sarandon
Freigeben: 2024-12-22 08:37:09
Original
979 Leute haben es durchsucht

Why Can't I Get the Name of a Go Method Parameter Using Reflection?

Den Namen eines Methodenparameters abrufen

Beim Arbeiten mit Go-Methoden kann es wünschenswert sein, den Namen eines bestimmten Parameters zu erhalten. Beispielsweise für die folgende Methode:

func (t *T) TMethod(data *testData) (interface{}, *error) {
    ...
}
Nach dem Login kopieren

möchte den Namen der Parameterdaten abrufen. Die Verwendung des folgenden Reflexionscodes gibt jedoch den Strukturnamen testData zurück:

reflect.ValueOf(T).MethodByName("TMethod").Type.In(0).Elem().Name()
Nach dem Login kopieren

Warum kann ich den Parameternamen nicht erhalten?

Eigentlich gibt es in der Go-Sprache keine Möglichkeit, den Namen einer Funktion oder eines Methodenparameters abzurufen. Dies liegt daran, dass der Name des Parameters für den Aufrufer nicht wichtig ist. Entscheidend ist lediglich die Art und Reihenfolge der Parameter.

Ein Funktionstyp stellt eine Sammlung aller Funktionen mit denselben Parameter- und Ergebnistypen dar. Wenn zwei Funktionen dieselben Parameter- und Ergebnistypen haben, sind ihre Typen unabhängig von den Namen der Parameter gleich. Der folgende Code gibt „true“ aus:

func f1(a int) {}
func f2(b int) {}

fmt.Println(reflect.TypeOf(f1) == reflect.TypeOf(f2))
Nach dem Login kopieren

Es ist sogar möglich, Funktionen oder Methoden zu erstellen, die ihren Parametern keine Namen geben (entweder sind alle oder keiner der Namen in der Parameter- oder Ergebnisliste vorhanden). Der folgende Code funktioniert:

func NamelessParams(int, string) {
    fmt.Println("NamelessParams called")
}
Nach dem Login kopieren

Problemumgehung

Wenn Sie ein benanntes Parameter-Framework erstellen möchten, das eingehende API-Parameter Go-Funktions-/Methodenparametern zuordnet, können Sie dies tun Verwenden Sie eine Struktur, da Sie benannte Felder mithilfe des Reflect-Pakets (z. B. Value.FieldByName() und Type.FieldByName()) abrufen können, oder Sie können eine Karte verwenden. Siehe die folgende verwandte Frage:

Funktionsfelder initialisieren

Details und Beispiele finden Sie im entsprechenden Artikel auf der Google-Mailingliste:

Existieren unbenannte Argumente in Go?

Das obige ist der detaillierte Inhalt vonWarum kann ich mithilfe von Reflection den Namen eines Go-Methodenparameters nicht abrufen?. 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