2015-12-12 8 views
11

Ich bin eine []interface{} Scheibe für einen bestimmten interface{} Wert suchen:Überprüfung Gleichheit der Schnittstelle {}

var v interface{} 
for i := 0; i < len(A); i++ { 
    if (A[i] == v) { 
    fmt.Println("Gotcha!") 
    break 
    } 
} 

Im trivialen Fall die Typen sind int. Was soll ich jedoch tun, wenn zum Beispiel die Typen benutzerdefiniert struct sind?

+3

Wenn die Strukturen [vergleichbar] sind (https://golang.org/ref/spec#Comparison_operators), funktioniert der Code wie er ist. –

+1

, um ein wenig zu erweitern, zitiert aus dem verknüpften Dokument von @CodingPickle: 'Schnittstellenwerte sind vergleichbar. Zwei Schnittstellenwerte sind gleich, wenn sie identische dynamische Typen und gleiche dynamische Werte haben oder wenn beide den Wert Null haben –

Antwort

15

Dank @CodingPickle Kommentar stelle ich die von der

Die Gleichheitsoperatoren == und! Go Programming Language Specification folgende = auf Operanden anwenden, die vergleichbar sind.

In Bezug auf interface{} s und structs:

  • Schnittstelle Werte vergleichbar sind. Zwei Schnittstellenwerte sind gleich, wenn sie identische dynamische Typen und gleiche dynamische Werte haben oder wenn beide den Wert nil haben.
  • Ein Wert x des Nicht-Schnittstellentyps X und ein Wert t des Schnittstellentyps T sind vergleichbar, wenn Werte vom Typ X vergleichbar sind und X T implementiert. Sie sind gleich, wenn der dynamische Typ von t identisch mit X ist und der dynamische Wert von t ist gleich x.
  • Struct-Werte sind vergleichbar, wenn alle Felder vergleichbar sind. Zwei Strukturwerte sind gleich, wenn ihre entsprechenden nicht leeren Felder gleich sind.

Mit anderen Worten, die Handhabung der Gleichheit scheint einfach in Go!