Maison  >  Article  >  développement back-end  >  La définition et l'application des génériques Golang

La définition et l'application des génériques Golang

王林
王林original
2024-04-04 10:18:02989parcourir

Les génériques ont été introduits dans Go 1.18 pour créer du code indépendant du type. Les génériques utilisent des crochets [] pour définir les paramètres de type, tels que func Sort[T any](arr []T). Le compilateur Go peut déduire des paramètres de type comme func Swap[T](x, y T). Les génériques peuvent être utilisés pour créer des structures de données, telles qu'un arbre de recherche binaire de type Node[T any] struct { … }, et imposer des contraintes de type, telles que le type Node[T comparable] struct { … }. Les génériques augmentent la flexibilité du code sans créer de nouveaux types.

La définition et lapplication des génériques Golang

La définition et l'application des génériques Go

Dans Go 1.18, le langage Go introduit une fonctionnalité très attendue : Génériques. Les génériques vous permettent de créer des structures de données et des algorithmes indépendants de types spécifiques, rendant votre code plus réutilisable et flexible.

Définir les génériques

Les génériques sont définis à l'aide de crochets [], qui contiennent un nombre quelconque de paramètres de type : [] 来定义,其中包含任意数量的类型参数:

func Sort[T any](arr []T)

在上面的示例中,T 是类型参数,代表可以是任何类型的项。

类型推断

如果函数的泛型类型参数可以在上下文中推断出来,则可以省略它们:

func Swap[T](x, y T)

此函数可以与任何类型的两个参数一起使用,Go 编译器会推断出 T 应该是 xy 的类型。

实战案例:二叉查找树

让我们创建一个二叉查找树的泛型版本:

type Node[T any] struct {
    Value    T
    Left     *Node[T]
    Right    *Node[T]
}

func Insert[T comparable](n *Node[T], value T) *Node[T] {
    // ...
}

func Search[T comparable](n *Node[T], value T) *Node[T] {
    // ...
}

这个二叉查找树允许我们存储和搜索任何可比较类型的元素。

类型约束

有时,您需要对类型参数施加约束。例如,为了确保在二叉查找树中比较两个值是有效的,我们可以要求 T 实现了 comparable

type Node[T comparable] struct {
    // ...
}

Dans l'exemple ci-dessus, T représente les paramètres de type. objets de tout type.

Inférence de type
  • Les paramètres de type génériques de la fonction peuvent être omis s'ils peuvent être déduits du contexte :
  • rrreee
  • Cette fonction peut être utilisée avec deux arguments de n'importe quel type, et le compilateur Go déduira T code> doit être de type <code>x et y.
  • Exemple pratique : arbre de recherche binaire
Créons une version générique d'un arbre de recherche binaire :

rrreee

Cet arbre de recherche binaire nous permet de stocker et de rechercher des éléments de tout type comparable.

Contraintes de type🎜🎜Parfois, vous devez imposer des contraintes sur les paramètres de type. Par exemple, pour garantir que la comparaison de deux valeurs dans un arbre de recherche binaire est valide, nous pouvons exiger que T implémente l'interface comparable : 🎜rrreee🎜Notes🎜🎜🎜 Les génériques Go ne sont pas des modèles de types, ils ne créent pas de nouveaux types. 🎜🎜Les paramètres de type générique ne peuvent pas être instanciés. 🎜🎜L'inférence de type s'applique uniquement lors de l'appel d'une fonction, pas lors de sa déclaration. 🎜🎜🎜Conclusion🎜🎜Les génériques Go apportent de nouvelles fonctionnalités puissantes au langage Go. Comprendre comment définir et utiliser des génériques est essentiel pour rendre votre code plus flexible et réutilisable. 🎜

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