2015-10-14 5 views
5

Weil nicht alle Typen vergleichbar sind, z.B. Eine Scheibe. So können wir nicht tun, um dieseWie kann man wissen, ob eine Variable beliebigen Typs in Golang Null ist?

var v ArbitraryType 
v == reflect.Zero(reflect.TypeOf(v)).Interface() 

bearbeiten - Lösung reflect.DeepEqual

var v ArbitratyType 
zero := reflect.Zero(reflect.TypeOf(v)).Interface() 
isZero := reflect.DeepEqual(v, zero) 

Go Dokumentation über reflect.DeepEqual

DeepEqual Tests für tiefe Gleichheit. Es verwendet wo möglich normal == Gleichheit, wird aber Elemente von Arrays, Slices, Maps und Feldern von Strukturen scannen.

Antwort

2

Wie Peter Noyes hervorhebt, müssen Sie nur sicherstellen, dass Sie nicht einen Typ vergleichen, der nicht vergleichbar ist. Glücklicherweise ist dies sehr einfach mit dem reflect Paket:

func IsZero(v interface{}) (bool, error) { 
    t := reflect.TypeOf(v) 
    if !t.Comparable() { 
     return false, fmt.Errorf("type is not comparable: %v", t) 
    } 
    return v == reflect.Zero(t).Interface(), nil 
} 

Sehen Sie ein Beispiel here verwenden.

2

die beiden folgenden geben Sie mir vernünftige Ergebnisse (wahrscheinlich, weil sie die gleichen sind?)

reflect.ValueOf(v) == reflect.Zero(reflect.TypeOf(v))) 

reflect.DeepEqual(reflect.ValueOf(v), reflect.Zero(reflect.TypeOf(v))) 

z.B. verschiedene Ganzzahl 0 Aromen und nicht initialisiert struct s sind "Null"

Leider sind leere Strings und Arrays nicht. und nil gibt eine Ausnahme.
Sie könnten Sonderfälle diese, wenn Sie wollten.

+0

Hallo Rhythmische, Vielen Dank für Ihre Antwort! In der Tat sind == und DeepEqual unterschiedlich. DeepEqual funktioniert sowohl für vergleichbare als auch für nicht vergleichbare Variablen, laut go document [reflect.DeepEqual] (https://golang.org/pkg/reflect/#DeepEqual) – v1ct0r

+0

soll ich das noch vergleichbarer verstehen, ich werde es mal ausprobieren , Vielen Dank. –

Verwandte Themen