Comment vérifier de manière générique la présence d'un élément dans une tranche dans Go
Dans Go, déterminer si une tranche contient un élément spécifique peut être un scénario courant. Cependant, il n'existe aucune méthode intégrée pour effectuer cette vérification générique sur différents types de tranches.
Tentative échouée avec l'interface{}
Tentative d'utilisation de l'interface{ } comme solution générique, comme indiqué ci-dessous, peut sembler plausible :
<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool { for _, item := range slice { if item == elem { return true } } return false }</code>
Cependant, comparer des valeurs de différents types (interface{}) peut conduire à des résultats incorrects.
Solution générique avec réflexion
Pour obtenir une solution véritablement générique, la réflexion peut être utilisée. La fonction suivante utilise la réflexion pour parcourir la tranche et comparer chaque élément à l'élément cible :
<code class="go">func Contains(slice, elem interface{}) bool { sv := reflect.ValueOf(slice) // Check that slice is actually a slice/array. if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array { return false } // Iterate the slice for i := 0; i < sv.Len(); i++ { // Compare elem to the current slice element if elem == sv.Index(i).Interface() { return true } } // Nothing found return false }</code>
Cette solution vous permet d'effectuer des vérifications d'éléments génériques sur des tranches de tout type.
Considérations relatives aux performances
Bien que la fonction générique Contient fournisse la fonctionnalité souhaitée, elle entraîne un coût de performances important. L'analyse comparative avec une fonction équivalente non générique donne un facteur de ralentissement d'environ 50x. Par conséquent, il est crucial d'évaluer les implications en termes de performances avant d'utiliser la réflexion pour les vérifications d'éléments génériques.
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!