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) { ... }
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()
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))
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") }
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!