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 :
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.
À 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.
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.
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.
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.
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é.
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