Déterminer si une tranche contient un élément particulier est une tâche courante en programmation. Cependant, le langage de programmation Go ne dispose pas d'une fonction intégrée à cet effet.
Une approche consiste à utiliser le type interface{} :
<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool { for _, item := range slice { if item == elem { return true } } return false }</code>
Cependant, cette approche nécessite d'écrire manuellement du code. pour chaque type de données, ce qui le rend fastidieux.
Heureusement, le package de réflexion de Go permet un code générique capable de gérer n'importe quel type de tranche :
<code class="go">func Contains(slice, elem interface{}) bool { sv := reflect.ValueOf(slice) // Check if slice is valid if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array { return false } // Iterate over slice elements for i := 0; i < sv.Len(); i++ { if elem == sv.Index(i).Interface() { return true } } // Element not found return false }</code>
Bien que l'approche basée sur la réflexion soit générique, elle entraîne une pénalité de performances significative par rapport aux fonctions non génériques spécifiques à un type. Les benchmarks ont montré un ralentissement de 50 à 60 x :
Generic: 730.23214 ns/op Non-Generic: 13.15262 ns/op
Bien que la réflexion offre un moyen d'écrire du code générique pour la vérification des éléments de tranche, il est important de peser soigneusement les compromis en termes de performances. . Pour les scénarios où les performances sont critiques, les fonctions non génériques spécifiques au type sont fortement recommandé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!