web-dev-qa-db-fra.com

Vérification de l'égalité de l'interface {}

Je recherche un []interface{} tranche pour un interface{} valeur:

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

Dans le cas trivial, les types sont int. Cependant, que dois-je faire si, par exemple, les types sont des struct personnalisés?

20
Brian

Merci au commentaire @CodingPickle, je fournis ce qui suit à partir de la Go Programming Language Specification

Les opérateurs d'égalité == et! = S'appliquent à des opérandes comparables.

En ce qui concerne interface{}s et structs:

  • Les valeurs d'interface sont comparables. Deux valeurs d'interface sont égales si elles ont des types dynamiques identiques et des valeurs dynamiques égales ou si les deux ont une valeur nulle.
  • Une valeur x de type non interface X et une valeur t de type interface T sont comparables lorsque les valeurs de type X sont comparables et X implémente T. Elles sont égales si le type dynamique de t est identique à X et la valeur dynamique de t est égal à x .
  • Les valeurs des structures sont comparables si tous leurs champs sont comparables. Deux valeurs de structure sont égales si leurs champs non vides correspondants sont égaux.

Vous pouvez également essayer ce terrain de jeu https://play.golang.org/p/bgO1_V87v9k

En d'autres termes, gérer l'égalité semble facile dans Go!

27
Brian Vanover

Mise à jour: depuis la rédaction de la question et des réponses ci-dessus, la langue de Go a légèrement changé.

Auparavant, si deux interfaces étaient comparées et que l'un des deux ou les deux contenaient un type non comparable, le temps d'exécution paniquait. Désormais, le runtime ne paniquera que s'ils contiennent tous les deux le type non comparable même. (S'ils contiennent des types différents, le résultat est désormais faux même si l'un ou l'autre type n'est pas comparable.)

Quels sont les types non comparables? Fondamentalement, ce sont des tranches, des cartes, des fonctions et tout type de structure ou de tableau qui les utilise.

AFAIK c'était un changement silencieux autour de Go 1.9 ou 1.10.

0
Andrew W. Phillips