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