2015-10-14 14 views
5

Perché non tutti i tipi sono comparabili, ad es. una fetta. Quindi non siamo in grado di fare questoCome sapere se una variabile di tipo arbitrario è zero in Golang?

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

Edit - Soluzione reflect.DeepEqual

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

documentazione Go circa reflect.DeepEqual

test DeepEqual l'uguaglianza forte. Utilizza la normale == uguaglianza laddove possibile, ma analizzerà elementi di matrici, sezioni, mappe e campi di strutture.

risposta

2

Come sottolinea Peter Noyes, devi solo assicurarti di non confrontare un tipo che non è comparabile. Per fortuna, questo è molto semplice, con il pacchetto reflect:

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 
} 

vedere un esempio utilizzare here.

2

entrambe le seguenti darmi risultati ragionevoli (probabilmente perché sono la stessa cosa?)

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

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

esempio vari interi 0 sapori e non inizializzati struct s sono "zero"

Purtroppo le stringhe e gli array vuoti non lo sono. e nil fornisce un'eccezione.
Si potrebbe caso speciale questi se si voleva.

+0

Hi Rhythmic, Grazie della risposta! In effetti, == e DeepEqual sono diversi. DeepEqual funziona sia per la variabile comparabile che per quella non confrontabile, secondo il documento go [reflect.DeepEqual] (https://golang.org/pkg/reflect/#DeepEqual) – v1ct0r

+0

Devo ancora comprenderlo, lo controllerò , Grazie. –