2015-12-12 14 views
11

sto cercando una fetta []interface{} per un dato valore di interface{}:Controllo parità di interfaccia {}

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

Nel caso banale i tipi sono int. Tuttavia, cosa devo fare se, ad esempio, i tipi sono personalizzati struct?

+3

Se le strutture sono [confrontabili] (https://golang.org/ref/spec#Comparison_operators), il codice funziona così com'è. –

+1

per espanderci un po ', citando dal documento collegato di @ CodingPickle: 'I valori dell'interfaccia sono comparabili. Due valori di interfaccia sono uguali se hanno identici tipi dinamici e valori dinamici uguali o se entrambi hanno un valore n –

risposta

15

Grazie al commento @CodingPickle, mi forniscono le seguenti dal Go Programming Language Specification

Gli operatori di uguaglianza == e! = Valgono per operandi che sono paragonabili.

Per quanto riguarda interface{} s e structs:

  • valori di interfaccia sono paragonabili. Due valori di interfaccia sono uguali se hanno identici tipi dinamici e valori dinamici uguali o se entrambi hanno un valore nullo.
  • Un valore x di tipo X non interfacciato e un valore t di tipo di interfaccia T sono confrontabili quando i valori di tipo X sono comparabili e X implementa T. Sono uguali se il tipo dinamico di t è identico al valore dinamico di X e t è uguale a x.
  • I valori di costruzione sono comparabili se tutti i loro campi sono comparabili. Due valori struct sono uguali se i corrispondenti campi non vuoti sono uguali.

In altre parole, gestire l'uguaglianza sembra facile in Go!