Explication détaillée des génériques Golang : nouvelles fonctionnalités et scénarios d'application
À mesure que le langage Golang mûrit progressivement et est largement utilisé, les développeurs ont une demande croissante pour ses fonctionnalités génériques. La programmation générique est une méthode d'implémentation de code commun dans un langage de programmation. Elle peut rendre le code plus flexible, réutilisable et améliorer la lisibilité du code. Dans la version 1.18 de Golang, la fonction générique a été officiellement introduite, apportant plus de possibilités et de commodité aux développeurs. Cet article combinera des exemples de code spécifiques pour expliquer en détail les nouvelles fonctionnalités et scénarios d'application des génériques Golang.
Dans les langages traditionnels à typage statique, il est souvent nécessaire d'écrire des fonctions ou des structures de données indépendantes pour chaque type de données. Cependant, il existe de nombreuses situations dans lesquelles nous devons écrire du code générique qui fonctionne sur plusieurs types de données. La programmation générique constitue un moyen efficace de résoudre ce problème. Elle nous permet d'écrire du code une seule fois et de l'appliquer à de nombreux types de données différents.
Dans Golang, les génériques sont principalement implémentés en fonction de paramètres de type. En ajoutant des paramètres de type aux définitions de fonctions, d'interfaces ou de structures de données, nous pouvons implémenter une logique de code commune et la rendre applicable à différents types de données.
Dans la version 1.18 de Golang, la fonctionnalité génériques est officiellement introduite, offrant aux développeurs plus de commodité et de possibilités. Grâce à l'introduction de paramètres de type, nous pouvons obtenir une écriture de code plus flexible et plus polyvalente.
func Print[T any](s []T) { for _, v := range s { fmt.Println(v) } }
Dans le code ci-dessus, nous déclarons un paramètre de type T en utilisant [T any]
dans la définition de la fonction, indiquant que cette fonction accepte des tranches de tout type comme paramètres. Dans le corps de la fonction, nous pouvons utiliser T comme un type concret. [T any]
来声明一个类型参数T,表示这个函数接受任意类型的切片作为参数。在函数体内,我们可以像使用具体类型一样使用T。
为了确保泛型代码的类型安全,Golang引入了类型参数的约束机制。通过在类型参数前添加约束条件,可以限制传入的类型必须符合特定规则。
func Add[T Numeric](x, y T) T { return x + y }
在上述代码中,我们为类型参数T添加了约束条件Numeric
type Stack[T any] struct { data []T } func (s *Stack[T]) Push(val T) { s.data = append(s.data, val) } func (s *Stack[T]) Pop() T { if len(s.data) == 0 { return nil } val := s.data[len(s.data)-1] s.data = s.data[:len(s.data)-1] return val }
Numeric
pour le paramètre de type T, indiquant que le type de données entrantes doit être un type numérique. Cela évite d’éventuelles erreurs de non-concordance de type au moment de l’exécution. Scénarios et exemples d'application1. Structure de données de conteneurL'utilisation de la programmation générique peut facilement implémenter des structures de données de conteneur courantes, telles que des tranches, des files d'attente, des piles, etc. Voici un exemple de structure de données de pile utilisant des génériques : func QuickSort[T Comparable](arr []T) []T { if len(arr) < 2 { return arr } pivot := arr[len(arr)/2] var less, greater []T for _, v := range arr { if v < pivot { less = append(less, v) } else if v > pivot { greater = append(greater, v) } } return append(append(QuickSort(less), pivot), QuickSort(greater)...) }
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!