Heim >Backend-Entwicklung >Golang >Wie kann ich mithilfe von Reflection einen Nullwert an eine Schnittstelle in Go übergeben?
Übergabe von Nullwerten an Schnittstellen über Reflection in Go
In Go bieten Schnittstellen eine Möglichkeit, Werte verschiedener Typen als eine einzelne Einheit darzustellen . Allerdings kann die Übergabe eines Nullwerts an eine Schnittstelle als Argument eine Herausforderung sein, insbesondere durch Reflektion.
Betrachten Sie die Funktion f(), die einen Schnittstellenfehler als Argument akzeptiert:
func f(e error) { if e == nil { fmt.Println("YEY! NIL") } else { fmt.Println("NOT NIL :(") } }
Angenommen, wir möchten mithilfe von Reflektion einen Nullwert an diese Funktion übergeben. Es werden zwei Ansätze versucht:
Ansatz 1:
nilArg := reflect.Zero(reflect.TypeOf((error)(nil)))
Dieser Ansatz gerät jedoch in Panik, da „reflect.Zero(nil)“ nicht zulässig ist.
Ansatz 2:
nilArg := reflect.Zero(reflect.TypeOf(&MyError{}))
Dieser Ansatz schlägt fehl, weil er erstellt keinen Null-Schnittstellenwert für Fehler.
Die Lösung liegt in der Verwendung von „reflect.TypeOf((*error)(nil)).Elem()“, um den konkreten Typ für den Schnittstellenfehler zu erhalten:
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
Dieser Trick funktioniert, weil die Übergabe eines Zeigers auf einen Nullwert an „reflect.TypeOf()“ es dem Reflexionssystem ermöglicht, den konkreten Typ zu bestimmen. Die Elem()-Methode ruft dann den zugrunde liegenden Typ für den Zeiger ab.
Indem wir nilArg mit diesem Ausdruck erstellen, können wir nun per Reflektion einen echten Nullwert an die Funktion f() übergeben:
rf := reflect.ValueOf(f) rf.Call([]reflect.Value{nilArg})
Dieser Aufruf führt die if-Anweisung in der Funktion korrekt aus und gibt „YEY! NIL“ aus.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Reflection einen Nullwert an eine Schnittstelle in Go übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!