"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Quand utiliser des arguments de tranche limités aux types de tranche par rapport aux arguments de tranche génériques dans Go ?

Quand utiliser des arguments de tranche limités aux types de tranche par rapport aux arguments de tranche génériques dans Go ?

Publié le 2024-11-09
Parcourir:432

When to Use Slice Arguments Constrained to Slice Types vs. Generic Slice Arguments in Go?

Arguments de tranche génériques : 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 limités 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 de tranche avec un type d'élément de E.

Argument de tranche générique

En revanche, considérez la fonction slices.Contient avec le premier argument simplement tapé comme []E. Cela autorise 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.

func Grow[S ~[]E, E any](s S, n int) S {
    // ...
}

func Grow2[E any](s []E, n int) []E {
    // ...
}

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 type comme tranche d'entrée, vous devez utiliser un argument de tranche limité aux types de tranche (~[]E). Sinon, l’utilisation d’un argument slice générique est suffisante.

Déclaration de sortie Cet article est réimprimé à l'adresse : 1729666579. En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3