Go Generics - Explication des contraintes de type et des unions
Dans les génériques Go, les unions jouent un rôle spécifique dans le cadre des contraintes d'interface. Voyons ce que cela signifie et comment cela se rapporte à votre question sur les tests avec différents types.
Que sont les unions ?
Dans les contraintes de type génériques, les unions définissent un ensemble de types auxquels un paramètre de type doit correspondre. Par exemple :
type intOrString interface { int | string }
Cette contrainte garantit que tout paramètre de type générique T doit être soit un entier, soit une chaîne.
Pourquoi les unions ne peuvent-elles pas être utilisées comme types ?
Une contrainte d'interface avec une union n'est pas un type d'interface classique. Cette distinction est intentionnelle dans la conception générique de Go.
Opérations autorisées sur les contraintes d'union
Les fonctions utilisant un paramètre de type avec une contrainte d'union ne peuvent effectuer que des opérations autorisées par chaque membre de l'ensemble syndical. Cela comprend :
Postuler à votre Question
Votre approche originale utilisait intOrString comme type, ce qui n'est pas autorisé. Pour utiliser correctement une contrainte d'union, modifiez votre code comme suit :
type testDifferenceInput[T intOrString] [][]T type testDifferenceOutput[T intOrString] []T type testDifference[T intOrString] struct { input testDifferenceInput[T] output testDifferenceOutput[T] } func TestDifference(t *testing.T) { var ttInts []testDifference[int] var ttStrings []testDifference[string] // Populate ttInts and ttStrings with test cases for _, tt := range append(ttInts, ttStrings) { // Execute the test case } }
En séparant les cas de test en fonction du paramètre de type, vous pouvez contourner la limitation selon laquelle un conteneur générique ne peut pas contenir d'éléments de différents types.
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!