Maison  >  Article  >  développement back-end  >  Quand utiliser ~[]E vs []E pour les arguments Slice dans Go ?

Quand utiliser ~[]E vs []E pour les arguments Slice dans Go ?

DDD
DDDoriginal
2024-10-24 04:23:02694parcourir

When to Use ~[]E vs []E for Slice Arguments in Go?

Explorer les subtilités des arguments génériques des tranches

Considérez deux fonctions du package de tranches expérimentales : Contient et Cultiver. Les deux fonctions acceptent les arguments slice, mais avec des contraintes de type différentes :

Contraintes de type

Le premier argument de Contains est de type []E, où E est contraint par comparable, indiquant que E doit être comparable . D'un autre côté, le premier argument de Grow a le type S, contraint par ~[]E, indiquant que S doit avoir un type sous-jacent qui est une tranche de E.

Implications pratiques

À première vue, il peut sembler qu’il n’y a aucune différence pratique entre l’utilisation de ces deux contraintes de type. Cependant, ce n'est pas le cas lorsque vous devez renvoyer une tranche du même type que l'argument dans Grow.

L'importance d'un paramètre de type contraint par tranche

Si vous devez renvoyer une tranche du même type que l'argument d'entrée, vous devez utiliser un paramètre de type qui se contraint lui-même à une tranche (par exemple, ~[]E). Cela permet à la fonction de renvoyer une valeur du même type que l'argument.

Une démonstration avec Grow

Considérons deux implémentations de Grow :

func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s
func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E

Lors du passage une tranche d'un type personnalisé avec une tranche comme type sous-jacent, Grow peut renvoyer une valeur du même type, contrairement à Grow2. Grow2 ne peut renvoyer qu'une valeur d'un type de tranche sans nom, []E.

Exemple

type ints []int // user-defined slice type ints
x := []int{1} // initialize a slice x of type []int
x2 := Grow(x, 10) // x2 will be of type []int
y := ints{1} // initialize a slice y of type ints
y2 := Grow(y, 10) // y2 will be of type ints

Ici, Grow2(y, 10) reçoit une valeur de type ints mais renvoie une valeur de type []int, ce qui n'est pas le comportement prévu.

Conclusion

En conclusion, lorsque l'appel de fonction nécessite de renvoyer une tranche du même type (éventuellement nommé) que l'argument, en utilisant un paramètre de type qui se contraint lui-même à une tranche (~[]E) est nécessaire. Sinon, un paramètre de type qui contraint uniquement le type d'élément (E any) peut être utilisé.

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