Pourquoi les fonctions Go ne peuvent-elles pas renvoyer des types avec des paramètres de type contraints ? C’est une question qui prête souvent à confusion. Dans le langage Go, le type de retour d'une fonction ne peut pas être un type avec des paramètres de type contraints. Cela est principalement dû à la prise en charge limitée des génériques dans le langage Go. Dans le langage Go, il n'existe pas de mécanisme générique similaire à celui de Java ou C#, et il n'existe aucune syntaxe pour prendre en charge les paramètres de type contraints. Par conséquent, le type de retour d’une fonction ne peut être qu’un type spécifique et les paramètres de type contraint ne peuvent pas être utilisés. Cela signifie que nous ne pouvons pas définir un type de retour dans une fonction dont le type de paramètre est un type contraint. De telles restrictions peuvent rendre l’écriture de code un peu plus lourde dans certains scénarios, mais elles font également partie de la conception du langage Go.
En essayant d'appliquer des transitions d'état valides au moment de la compilation, j'ai rencontré la limitation selon laquelle les fonctions ne peuvent pas renvoyer de types génériques avec des paramètres de type non concrets, comme décrit dans le problème ici. Impossible de construire mre (aller vers le lien terrain de jeu) :
type mystruct[t any] struct { myfield t } func returnconstrainedgeneric[t any]() mystruct[t] { return mystruct[int]{ myfield: 1, } }
Le compilateur renvoie une erreur cannot use mystruct[int]{…} (value of type mystruct[int]) as mystruct[t] value in return statements
.
La question liée donne ce raisonnement :
The error occurs because operations that involve a type parameter (including assignments and returns) must be valid for all types in its type set.
Il décrit plusieurs solutions de contournement, y compris les assertions de type, mais je suis curieux de savoir pourquoi cette limitation existe. Naïvement, dans mon exemple je voudrais contraindre from . Qu'est-ce qui manque dans mon raisonnement ? S'agit-il d'un problème fondamental lié à la façon dont go implémente les contraintes génériques/types, ou est-ce un problème avec l'implémentation actuelle du compilateur go, ou est-ce autre chose ? returnconstrainedgeneric()
返回 mystruct[int]
类型的值是有效的,因为 int
满足 any
的类型约束。我希望 returnconstrainedgeneric()
的调用者不知道返回值的类型为 mystruct[int]
,它只知道它是 mystruct[t]
,其中 t
满足 any
Solution de contournement
x:=returnconstrainedgeneric[string]() // x is mystruct[string]
Mais vous essayez de revenir
.
mystruct[int]
Le défaut de votre raisonnement est que vous spécifiez le type de retour de la fonction lorsque vous l'instanciez. La fonction ne peut pas renvoyer la même valeur qui satisfait
any
约束的类型,它返回实例化的类型。换句话说,实例化函数的 t
必须与 mystruct[t]
中的 t
Si vous revenez toujours
func returnconstrainedgeneric[t any]() mystruct[int] {...}
mystruct[int]
Ou, si la fonction n'est pas utilisée du tout :
func returnConstrainedGeneric() MyStruct[int] {...}
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!