Maison > développement back-end > Golang > le corps du texte

Pourquoi les fonctions Go ne peuvent-elles pas renvoyer des types avec des paramètres de type contraints ?

WBOY
Libérer: 2024-02-09 15:06:09
avant
913 Les gens l'ont consulté

为什么 Go 函数不能返回带有约束类型参数的类型?

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.

Contenu de la question

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,
    }
}
Copier après la connexion

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.
Copier après la connexion

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 满足 anySolution de contournement

Ceci n'est pas valide car la syntaxe signifie

x:=returnconstrainedgeneric[string]()
// x is mystruct[string]
Copier après la connexion

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] 中的 tSi vous revenez toujours

, déclarez-le ainsi :

func returnconstrainedgeneric[t any]() mystruct[int] {...}
Copier après la connexion
mystruct[int]Ou, si la fonction n'est pas utilisée du tout

 :

func returnConstrainedGeneric() MyStruct[int] {...}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal