In Go können Sie Funktionen mit Schnittstellenargumenten definieren. Während es einfach ist, einen Schnittstellenwert ungleich Null zu übergeben, stellt sich die Frage: Wie übergibt man einen Nullwert per Reflektion, damit er eine == Nullprüfung besteht?
Betrachten Sie die folgende Funktion:
func f(e error) { if e == nil { fmt.Println("YEY! NIL") // how to get here? } else { fmt.Println("NOT NIL :(") } }
func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf((error)(nil))) // panic: reflect: Zero(nil) }
Dieser Ansatz schlägt fehl als „reflect.Zero(reflect.TypeOf((error)(nil)))“ gerät in Panik, weil Sie keinen Nullwert eines Nulltyps erstellen können.
type MyError struct{} func (e MyError) Error() string { return "" } func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf(&MyError{})) // NOT NIL :( }
Dieser Ansatz schlägt auch aufgrund des Go-FAQ-Eintrags zu Nullfehlern fehl, der besagt, dass Schnittstellentypen Null sein oder auf einen bestimmten Typ verweisen können. Insbesondere das Übergeben von Null ist nicht normal. Wenn Sie versuchen, eine Methode auf einer Nullschnittstelle aufzurufen, kommt es zu einer Panik.
Um eine Null ordnungsgemäß zu übergeben Um den Wert über Reflektion zu ermitteln, verwenden Sie den Ausdruck „reflect.TypeOf((*error)(nil)).Elem()“, um den „reflect.Type“ für die Fehlerschnittstelle zu erhalten. Dieser Ausdruck erstellt einen Nicht-Schnittstellenwert und verwendet Reflexionsmethoden, um den gewünschten Reflect.Type zu erhalten.
Erstellen Sie nilArg wie folgt:
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
Bei diesem Ansatz wird der Aufruf von f mit nilArg gedruckt „YEY! NIL.“
Eine funktionierende Implementierung finden Sie im Playground-Beispiel.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Reflection in Go einen Null-Schnittstellenwert übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!