Heim > Backend-Entwicklung > Golang > Wie kann ich mithilfe von Reflection einen Nullwert an eine Schnittstelle in Go übergeben?

Wie kann ich mithilfe von Reflection einen Nullwert an eine Schnittstelle in Go übergeben?

Mary-Kate Olsen
Freigeben: 2024-11-17 12:01:01
Original
967 Leute haben es durchsucht

How Can I Pass a Nil Value to an Interface in Go Using Reflection?

Ü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 :(")
    }
}
Nach dem Login kopieren

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)))
Nach dem Login kopieren

Dieser Ansatz gerät jedoch in Panik, da „reflect.Zero(nil)“ nicht zulässig ist.

Ansatz 2:

nilArg := reflect.Zero(reflect.TypeOf(&MyError{}))
Nach dem Login kopieren

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())
Nach dem Login kopieren

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})
Nach dem Login kopieren

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!

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