Maison >développement back-end >Golang >Comment les génériques Go gèrent-ils les unions et leurs limitations dans les contraintes de type et les conteneurs ?
Dans Go, les syndicats servent deux objectifs principaux :
Cependant, c'est crucial à noter que les unions ne peuvent être utilisées que dans des contraintes d'interface. Essayer de les utiliser comme types réguliers, comme dans tt := []testDifference[intOrString] n'est pas pris en charge.
De plus, les conteneurs génériques, tels que les tranches, ne peuvent pas contenir d'éléments de types différents. Alors que votre tranche de test inclut à la fois testDifference[int] et testDifference[string], ces instanciations concrètes sont de types différents.
Pour résoudre ce problème, vous pouvez soit utiliser une tranche distincte pour chaque type (ttInts et ttStrs) ou stockez tous les éléments sous forme d'interfaces ([]interface{}).
Les opérations sur les contraintes d'union sont limitées à celles prises en charge par tous les types de l'ensemble de types. Dans le cas de int | chaîne, cela inclut la déclaration de variable, les conversions, les comparaisons, le classement et l'opérateur.
Exemple :
type intOrString interface { int | string } func beforeIntOrString[T intOrString](a, b T) bool { return a < b } func sumIntOrString[T intOrString](a, b T) T { return a + b } func main() { fmt.Println(beforeIntOrString("foo", "bar")) // false fmt.Println(beforeIntOrString(4, 5)) // true fmt.Println(sumIntOrString("foo", "bar")) // foobar fmt.Println(sumIntOrString(10, 5)) // 15 }
Dans cet exemple, beforeSendIntOrString et sumIntOrString sont des fonctions génériques qui fonctionnent respectivement avec les valeurs int et string.
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!