"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 ~[]E vs []E pour les arguments Slice dans Go ?

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

Publié le 2024-11-04
Parcourir:641

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

Exploration des subtilités des arguments génériques des tranches

Considérez deux fonctions du package de tranches expérimentales : Contient et Grow. Les deux fonctions acceptent les arguments de tranche, 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 d'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 cas 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é.

Déclaration de sortie Cet article est réimprimé à l'adresse : 1729668019. 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