Contraintes de type d'interface : comprendre et éviter les erreurs de « contraintes de type »
Dans Go, les interfaces sont des constructions puissantes qui définissent un ensemble de méthodes qui un type doit implémenter. Cependant, toutes les interfaces ne sont pas égales. Les interfaces qui contiennent des contraintes de type imposent des limitations supplémentaires sur leur utilisation.
Considérez la définition de type suivante :
type Number interface { int | int64 | float64 }
Cette interface définit un type Number qui peut représenter soit int, int64 ou float64. Cependant, les spécifications du langage Go interdisent explicitement d'utiliser de telles interfaces avec des éléments de type dans tout contexte autre que comme contraintes de paramètres de type.
Le compilateur générera l'erreur "l'interface contient des contraintes de type" lorsque vous tenterez d'utiliser une interface avec tapez des éléments dans d’autres scénarios. Par exemple, l'extrait de code suivant ne pourra pas être compilé :
type NumberSlice []Number // interface contains type constraints func main() { a := []Number{Number(1), Number(2), Number(3), Number(4)} // cannot use interface Number in conversion }
Cette erreur est due au fait que Number est une interface avec des contraintes de type et ne peut donc pas être utilisée comme type d'élément d'une tranche.
Semblables aux interfaces avec des éléments de type, les interfaces qui intègrent des interfaces comparables ou d'autres interfaces non basiques sont également non basiques. Pour éviter ces erreurs, assurez-vous que vos interfaces contiennent uniquement des méthodes ou intègrent des interfaces de base.
Exemples d'interfaces de base et non basiques :
Basique : Uniquement les méthodes
type A1 interface { GetName() string }
Basique : Méthodes et interface de base intégrée
type B1 interface { A1 SetValue(v int) }
Non basique : Intégration comparable
type Message interface { comparable Content() string }
Non basique : possède un élément de type (union)
type Number interface { int | int64 | float64 }
Non basique : intègre une interface non basique
type SpecialNumber interface { Number IsSpecial() bool }
Utilisation correcte des interfaces avec des contraintes de type
Les interfaces avec des contraintes de type ne peuvent être utilisées que comme contraintes de paramètres de type. Par exemple :
type Coordinates[T Number] struct { x, y T } func sum[T Number](a, b T) T { return a + b }
Dans ce scénario, les interfaces sont utilisées pour restreindre les types autorisés pour les types et fonctions génériques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!