Heim > Backend-Entwicklung > Golang > Wie kann ich mithilfe von Reflection in Go einen Null-Schnittstellenwert übergeben?

Wie kann ich mithilfe von Reflection in Go einen Null-Schnittstellenwert übergeben?

Mary-Kate Olsen
Freigeben: 2024-11-30 14:10:14
Original
303 Leute haben es durchsucht

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

Übergabe eines Nullwerts als Schnittstelle durch Reflexion in Go

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

Ansatz 1: Reflect.Zero verwenden

func main() {
    rf := reflect.ValueOf(f)

    nilArg := reflect.Zero(reflect.TypeOf((error)(nil))) // panic: reflect: Zero(nil)
}
Nach dem Login kopieren

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.

Ansatz 2: Verwenden von Typeof(&type)

type MyError struct{}
func (e MyError) Error() string {
    return ""
}

func main() {
    rf := reflect.ValueOf(f)
    nilArg := reflect.Zero(reflect.TypeOf(&MyError{})) // NOT NIL :(
}
Nach dem Login kopieren

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.

Lösung: Verwenden Sie TypeOf((*error)(nil)).Elem()

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

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!

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