Heim  >  Artikel  >  Backend-Entwicklung  >  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
Mary-Kate OlsenOriginal
2024-11-17 12:01:01891Durchsuche

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 :(")
    }
}

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!

Stellungnahme:
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