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 ?

Comment les génériques Go gèrent-ils les unions et leurs limitations dans les contraintes de type et les conteneurs ?

DDD
DDDoriginal
2024-12-26 21:51:14500parcourir

How Do Go Generics Handle Unions and Their Limitations in Type Constraints and Containers?

Go Generics - Les syndicats et leurs limites

Dans Go, les syndicats servent deux objectifs principaux :

  1. Spécifier les ensembles de types dans contraintes d'interface : Les unions permettent de restreindre un paramètre de type générique à un ensemble de paramètres spécifiques types.
  2. Inclure des éléments approximatifs :L'utilisation du symbole ~ dans une union indique que d'autres types compatibles peuvent être inclus.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn