Maison > développement back-end > Golang > le corps du texte

Comment vérifier l'existence d'éléments dans les tranches Go : solutions génériques ou non génériques ?

Barbara Streisand
Libérer: 2024-10-31 20:57:29
original
213 Les gens l'ont consulté

How to Check for Element Existence in Go Slices: Generic vs. Non-Generic Solutions?

Solution générique pour vérifier l'existence d'un élément dans une tranche

Souvent, lorsqu'on traite des tranches dans Go, il est nécessaire de déterminer si un élément spécifique existe dans la tranche. Bien qu'il n'existe pas de méthode intégrée pour cela, une solution générique peut être obtenue en utilisant la réflexion. Bien que la réflexion offre un moyen de travailler avec des objets de manière dynamique, elle a un coût en termes de performances.

Package Reflect

Le package Reflect fournit un moyen d'inspecter et de manipuler les données au moment de l'exécution. Pour les tranches, nous pouvons utiliser réfléchissant.ValueOf(slice) pour obtenir un reflet.Value représentant la tranche. À partir de là, nous pouvons vérifier s'il s'agit d'une tranche en vérifiant son Kind() et parcourir ses éléments en utilisant Len() et Index().

Considérations sur les performances

La solution générique utilisant la réflexion est considérablement plus lent que ses équivalents non génériques. Une fonction personnalisée qui vérifie spécifiquement un type d'élément donné entraînera de bien meilleures performances.

Exemple de code

Le code suivant montre une implémentation de la fonction générique Contains() et d'une fonction non générique. ContainsNonGeneric() à titre de comparaison :

<code class="go">import "reflect"

func Contains(slice, elem interface{}) bool {
    sv := reflect.ValueOf(slice)
    if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array {
        return false
    }
    for i := 0; i < sv.Len(); i++ {
        if elem == sv.Index(i).Interface() {
            return true
        }
    }
    return false
}

func ContainsNonGeneric(slice []int, elem int) bool {
    for _, i := range slice {
        if i == elem {
            return true
        }
    }
    return false
}

func main() {
    si := []int{3, 4, 5, 10, 11}
    ss := []string{"hello", "world", "foo", "bar"}

    fmt.Println(Contains(si, 3))
    fmt.Println(Contains(si, 100))
    fmt.Println(Contains(ss, "hello"))
    fmt.Println(Contains(ss, "baz"))
}</code>
Copier après la connexion

Conclusion

Bien que la fonction générique Contains() fournisse un moyen de vérifier l'existence d'un élément dans des tranches de tout type, il est crucial de prendre en compte les implications en termes de performances. . Pour des performances optimales, des fonctions personnalisées avec des vérifications de type spécifiques doivent être utilisées autant que possible.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal