Tirer parti des génériques pour le code GO réutilisable et de type type
Avant GO 1.18, la réutilisabilité du code est souvent impliquée à l'aide d'interfaces, qui, bien que puissantes, pourraient conduire à moins de sécurité et à des erreurs potentiellement d'exécution. Les génériques offrent une solution plus élégante. Ils vous permettent d'écrire des fonctions et des structures de données qui peuvent fonctionner sur différents types sans sacrifier la sécurité de type. Ceci est réalisé grâce à l'utilisation de paramètres de type, indiqués par des crochets []
.
Illustrons avec un exemple simple: une fonction pour trouver l'élément maximum dans une tranche. Sans génériques, vous auriez besoin d'écrire des fonctions distinctes pour différents types (par exemple, MaxInt
, MaxFloat64
, etc.). Avec les génériques, vous pouvez écrire une fonction:
Remarquez la partie [T constraints.Ordered]
. Cela déclare un paramètre de type T
limité aux types qui implémentent l'interface constraints
constraints.Ordered
. Cela garantit que seuls les types comparables peuvent être utilisés avec la fonction Max
, empêchant les erreurs d'exécution. Cette contrainte applique la sécurité de type au temps de compilation. Si vous essayez d'utiliser Max
avec un type qui ne satisfait pas constraints.Ordered
. Il s'agit d'une amélioration significative par rapport à la dépendance précédente à l'égard des interfaces qui ne vérifiaient qu'à l'exécution. Vous pouvez également créer vos propres contraintes personnalisées pour définir vos exigences de type spécifique.
Avantages clés des génériques en Go
L'introduction des génériques dans GO 1.18 a apporté plusieurs améliorations cruciales par rapport aux versions précédentes:
Implémentations génériques de structures de données GO communes
De nombreuses structures de données GO courantes bénéficient considérablement des implémentations génériques:
Stack
: Une pile peut être implémentée génériquement pour stocker des éléments de tout type, en garantissant la sécurité du type et en évitant le besoin de types de type affirmations.Queue
: Similaire à une pile, une file d'attente générique permet de stocker des éléments de tout type tout en maintenant la sécurité de type.List
(liste liée): Une liste liée peut être générée générique, vous permettant de stocker des nœuds contenant des éléments de différents types.Map
(déjà générique): Bien que map
intégrée de Go soit déjà quelque peu générique (elle peut stocker les valeurs de n'importe quel type), le type de clé est également un paramètre, ce qui le rend intrinsèquement générique. Cependant, les limites des cartes (par exemple, sans prendre en charge les types personnalisées pour les clés, sauf s'ils implémentent l'opérateur d'égalité) mettent en évidence la nécessité des capacités les plus puissantes de génériques explicitement déclarés.Tree
(par exemple, arbre de recherche binaire): les arbres génériques vous permettent de stocker les nœuds avec des valeurs de différents types tout en maintenant la structure et les propriétés de l'arbre.Set
: Une implémentation de jeu générique permet de stocker des éléments de tout type comparable, offrant un moyen de type de type de gérer des collections d'éléments uniques. La mise en œuvre de ces structures de données réduit génériquement la duplication de code et améliore considérablement la maintenabilité. Par exemple, une implémentation Stack
générique peut ressembler à ceci:
Gestion efficace des contraintes et des paramètres de type
L'utilisation efficace des contraintes et des paramètres de type est cruciale pour écrire du code générique robuste et réutilisable dans GO.
constraints
fournit des contraintes prédéfinies comme Ordered
, Integer
, Float
, etc. Vous pouvez également définir vos propres contraintes personnalisées à l'aide d'interfaces.[]
suivant la fonction ou le nom de type. Ils représentent les types qui peuvent être utilisés avec le code générique. Cette fonction PrintValue
n'acceptera que des types qui implémentent l'interface Stringer
.
T int | string
). Cependant, vous pouvez simuler cela à l'aide d'interfaces. Par exemple, si vous avez besoin d'une fonction pour gérer les valeurs int
ou string
, vous pouvez définir une interface que les deux types satisfont.En choisissant et en définissant soigneusement les contraintes et les paramètres de type, vous pouvez créer du code générique flexible, de type type et hautement réutilisable dans GO. N'oubliez pas de considérer soigneusement les contraintes nécessaires pour assurer la flexibilité et la sécurité dans vos fonctions génériques et vos structures de données.
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!