Heim >Backend-Entwicklung >Golang >Wie lassen sich Nullwerte in Go-Schnittstellen mithilfe von Reflection effizient erkennen?

Wie lassen sich Nullwerte in Go-Schnittstellen mithilfe von Reflection effizient erkennen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-12 18:45:15528Durchsuche

How to Efficiently Detect Zero Values in Go Interfaces Using Reflection?

Effiziente Erkennung leerer Werte in Go mithilfe von Reflection

Beim Umgang mit Schnittstellen{}-Werten in Go und der Notwendigkeit festzustellen, ob sie nicht initialisiert sind ( d. h. einen Wert von 0, „“, „falsch“ oder „nil“ haben), bietet Reflexion eine praktische Lösung. So können Sie dies erreichen:

func IsZeroOfUnderlyingType(x interface{}) bool {
    return x == reflect.Zero(reflect.TypeOf(x)).Interface()
}

Es ist wichtig, zwischen zwei unterschiedlichen Konzepten zu unterscheiden:

  • Null-Schnittstellenwert:Ein Schnittstellenwert ohne Basiswert Wert (der Nullwert eines Schnittstellentyps).
  • Nicht-Null-Schnittstellenwert mit Null zugrunde liegend Wert: Ein Schnittstellenwert mit einem zugrunde liegenden Wert, aber dieser Wert ist der Nullwert seines Typs (z. B. Null-Map, Null-Zeiger, 0-Zahl).

Die obige Funktion prüft auf der zweite Fall, bei dem der zugrunde liegende Wert Null ist.

Gegenleistung für nicht vergleichbar Typen

Die Funktion verwendet den ==-Operator, der für nicht vergleichbare Typen möglicherweise nicht funktioniert. Um dieses Problem zu beheben, können Sie stattdessen „reflect.DeepEqual()“ verwenden:

func IsZeroOfUnderlyingType(x interface{}) bool {
    return reflect.DeepEqual(x, reflect.Zero(reflect.TypeOf(x)).Interface())
}

Diese aktualisierte Funktion funktioniert korrekt mit allen Typen, auch mit nicht vergleichbaren.

Das obige ist der detaillierte Inhalt vonWie lassen sich Nullwerte in Go-Schnittstellen mithilfe von Reflection effizient erkennen?. 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