Maison >développement back-end >Golang >Lors du renvoi de tranches à partir de fonctions, comment les contraintes de tranche affectent-elles la préservation du type ?

Lors du renvoi de tranches à partir de fonctions, comment les contraintes de tranche affectent-elles la préservation du type ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-23 15:45:02842parcourir

When Returning Slices from Functions, How Do Slice Constraints Affect Type Preservation?

Arguments génériques de tranche par rapport aux contraintes de type de tranche

Dans le package de tranches expérimentales de Go, deux fonctions, Contient et Grow, prennent des arguments de type différent contraintes. Contains prend le type générique []E, tandis que Grow contraint son type d'argument à être une tranche (~[]E).

Contraintes de type

Une contrainte de type, noté ~, garantit qu'un type est conforme à une interface spécifique ou à un ensemble de règles. Dans Grow, la contrainte ~[]E impose que le type d'argument soit finalement une tranche avec un élément de type E.

Fonctionnalité équivalente ?

Malgré les différentes contraintes de type , les opérations disponibles dans les deux fonctions semblent presque identiques. Cependant, une différence pratique clé apparaît lorsque les fonctions doivent renvoyer une tranche du même type que l'argument d'entrée.

Retour des tranches

Lors du retour d'une tranche du même type comme entrée, il est crucial d'utiliser une contrainte de type comme ~[]E. Cela permet à la fonction de conserver le type nommé de la tranche d'entrée.

Considérez deux versions de Grow() :

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

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

Si Grow() reçoit un type de tranche personnalisé, il peut renvoyer une tranche du même type, tandis que Grow2() renverra toujours une tranche sans nom.

Démonstration

type MyInts []int
x := MyInts{1} // Custom slice type
x2 := Grow(x, 10) // Type preserved
x3 := Grow2(x, 10) // Unnamed type

Dans cet exemple, x2 sera une tranche de tapez MyInts, tandis que x3 sera une tranche sans nom.

Conclusion

Lorsque vous devez conserver le type nommé d'une tranche d'entrée dans la valeur de retour, il est nécessaire pour utiliser une contrainte de type comme ~[]E. Sinon, la tranche renvoyée sera toujours d'un type sans nom.

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!

Déclaration:
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