Maison  >  Article  >  développement back-end  >  Comprendre les génériques Golang à partir de zéro

Comprendre les génériques Golang à partir de zéro

PHPz
PHPzoriginal
2024-03-18 17:21:04311parcourir

Comprendre les génériques Golang à partir de zéro

Golang est un langage de programmation open source conçu et développé par Google et lancé pour la première fois en 2009. En tant que langage moderne, Golang a toujours été apprécié des développeurs pour sa simplicité et son efficacité. Cependant, jusqu'à récemment, Golang a été critiqué pour son manque de support pour les génériques. Les génériques sont une fonctionnalité d'un langage de programmation qui permet d'écrire du code générique pour prendre en charge différents types de données.

Dans la communauté Golang, il y a eu une controverse sur le moment où Golang implémentera la fonctionnalité générique. Jusqu'à la version Go 1.18 (sortie en mars 2021), Golang a officiellement annoncé qu'il supportait officiellement les fonctions génériques. Cela signifie également que Golang a fait un grand pas en avant vers les génériques, permettant aux développeurs d'écrire plus facilement du code plus flexible et plus polyvalent.

Pour comprendre les fonctionnalités génériques de Golang, nous devons repartir de zéro. Tout d’abord, nous devons comprendre comment définir des fonctions génériques et des structures de données dans Golang. Ce qui suit est un exemple simple qui montre comment utiliser des fonctions génériques pour implémenter la fonction de recherche d'éléments dans une tranche :

package main

import (
    "fmt"
)

// 泛型函数:查找切片中的元素
func findElement[T comparable](slice []T, element T) bool {
    for _, v := range slice {
        if v == element {
            return true
        }
    }
    return false
}

func main() {
    intSlice := []int{1, 2, 3, 4, 5}
    strSlice := []string{"apple", "banana", "cherry"}

    // 调用泛型函数查找元素
    fmt.Println(findElement(intSlice, 3))     // true
    fmt.Println(findElement(strSlice, "pear")) // false
}

Dans le code ci-dessus, nous définissons une fonction générique findElement et utilisons le type générique le paramètre T est utilisé et la contrainte comparable est utilisée pour garantir que le type transmis prend en charge les opérations de comparaison. Dans la fonction main, nous définissons un intSlice et un strSlice, et appelons respectivement la fonction findElement pour rechercher des éléments. On peut voir que grâce aux fonctions génériques, nous pouvons écrire du code adapté à différents types de structures de données à la fois, ce qui améliore la réutilisabilité du code. findElement,使用了泛型类型参数T,并使用了约束comparable确保传入的类型支持比较操作。在main函数中,我们定义了一个intSlicestrSlice,并分别调用了findElement函数来查找元素。可以看到,通过泛型函数,我们可以一次性编写出适用于不同类型的数据结构的代码,提高了代码的复用性。

除了泛型函数,Golang的泛型还支持泛型数据结构。下面是一个简单的例子,展示了如何使用泛型切片来实现一个栈的数据结构:

package main

import "fmt"

// 泛型类型:栈
type Stack[T any] []T

// 入栈
func (s *Stack[T]) Push(value T) {
    *s = append(*s, value)
}

// 出栈
func (s *Stack[T]) Pop() T {
    if len(*s) == 0 {
        panic("stack is empty")
    }
    value := (*s)[len(*s)-1]
    *s = (*s)[:len(*s)-1]
    return value
}

func main() {
    var intStack Stack[int]

    // 入栈
    intStack.Push(1)
    intStack.Push(2)
    intStack.Push(3)

    // 出栈
    fmt.Println(intStack.Pop()) // 3
    fmt.Println(intStack.Pop()) // 2
}

在上面的代码中,我们定义了一个泛型类型Stack[T any]表示栈数据结构,同时定义了入栈Push和出栈Pop的方法。在main函数中,我们创建了一个intStack

En plus des fonctions génériques, les génériques de Golang prennent également en charge les structures de données génériques. Voici un exemple simple qui montre comment utiliser des tranches génériques pour implémenter une structure de données de pile :

rrreee

Dans le code ci-dessus, nous définissons un type générique Stack[T any] Représente la structure de données de pile, et définit également les méthodes de poussée dans la pile Push et de sortie de la pile Pop. Dans la fonction main, nous créons une instance intStack et effectuons des opérations push et pop dessus. Grâce à des structures de données génériques, nous pouvons définir une structure de données de pile générale comme dans l'exemple ci-dessus et prendre en charge différents types d'éléments en même temps.

Grâce aux deux exemples ci-dessus, nous avons une compréhension préliminaire de la façon d'utiliser les fonctionnalités génériques dans Golang. Dans l'implémentation générique de Golang, en plus des fonctions génériques et des structures de données génériques présentées dans l'exemple, il prend également en charge des fonctionnalités telles que les interfaces génériques et les contraintes de type génériques. Les développeurs peuvent choisir les fonctionnalités appropriées pour implémenter les génériques en fonction de besoins spécifiques. 🎜🎜En général, la fonction générique de Golang offre aux développeurs des capacités de programmation plus puissantes, rendant le code plus flexible et polyvalent. Bien que la fonction générique de Golang ait été lancée relativement tard, elle est puissante et facile à utiliser, et peut aider les développeurs à écrire du code universel plus efficacement. J'espère que cet article pourra aider les lecteurs à mieux comprendre les fonctionnalités génériques de Golang et comment écrire du code générique à partir de zéro. 🎜

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