Arguments génériques de tranche : comprendre la distinction
Dans Go, la programmation générique introduit des paramètres de type qui permettent aux fonctions d'opérer sur différents types. Un domaine d'intérêt est la distinction entre les arguments de tranche contraints aux types de tranche et les arguments de tranche génériques.
Argument de tranche contraint aux types de tranche
Considérez la fonction slices.Grow avec le premier argument contraint par ~[]E. Cela signifie que le type de cet argument doit être un type slice avec un type d'élément E.
Argument Slice générique
En revanche, considérons la fonction slices.Contains avec le premier argument simplement tapé comme []E. Cela permet n'importe quel type de tranche avec un type d'élément de E.
Différences pratiques
Au départ, il peut sembler que ces deux types d'arguments de tranche se comportent de la même manière, car ils les deux permettent aux fonctions d'accéder aux opérations de tranche telles que l'ajout et la plage. Cependant, il existe une différence subtile mais importante lorsqu'il s'agit de renvoyer une tranche.
Renvoyer une tranche
Si la fonction nécessite de renvoyer une tranche du même type que la tranche d'entrée, vous devez utiliser un argument de tranche limité aux types de tranche (~[]E). Cela garantit que la tranche renvoyée a le type sous-jacent correct.
Exemple
Comparons deux implémentations de Grow() : l'une utilisant ~[]E et l'autre utilisant [ ]E.
<code class="go">func Grow[S ~[]E, E any](s S, n int) S { // ... } func Grow2[E any](s []E, n int) []E { // ... }</code>
Si nous transmettons une tranche d'un type personnalisé (par exemple, []MyInt), Grow() peut renvoyer une valeur de ce même type. Cependant, Grow2() ne peut renvoyer qu'un type de tranche générique ([]E).
Conclusion
En résumé, si vous devez renvoyer une tranche du même type comme tranche d'entrée, vous devez utiliser un argument de tranche limité aux types de tranche (~[]E). Sinon, utiliser un argument slice générique est suffisant.
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!