Maison > développement back-end > Golang > Génériques Golang - ne peut pas utiliser le type à la place du même type lors du passage du pointeur de fonction

Génériques Golang - ne peut pas utiliser le type à la place du même type lors du passage du pointeur de fonction

PHPz
Libérer: 2024-02-06 10:33:03
avant
530 Les gens l'ont consulté

Golang 泛型 - 在传递函数指针时不能使用类型代替相同类型

Contenu de la question

Je suis nouveau sur Golang et je travaille sur la structure suivante :

<code>type Flag[T any] struct {
    defaultValue interface{}
}
</code>
Copier après la connexion

Parmi eux T 可以是 intbool

J'ai défini la fonction suivante :

<code>func (f Flag[T]) GetVariation(val interface{}, getFunc func(v T) T ) T {
    inputVal := f.defaultValue.(T)

    return getFunc(inputVal)
}
</code>
Copier après la connexion

Lorsque j'essaie d'utiliser la fonction ci-dessus pour différents types de données comme bool, en utilisant ce qui suit :

<code>func (f Flag[bool]) GetBoolVariation(val bool) bool {
    return f.GetVariation(val, someFunc)
}

func someFunc(v bool) bool {
    return true
}
</code>
Copier après la connexion

Je reçois le message d'erreur suivant :

cannot use someFunc (value of type func(v bool)  bool) as func(v bool) bool value in argument to f.GetVariation
Copier après la connexion

Le message est très déroutant car il dit que je ne peux pas utiliser "X" comme "X". Pouvez-vous m'aider à comprendre ce que je fais de mal ici ?


Bonne réponse


Tout d'abord, il est difficile d'évaluer votre cas d'utilisation plus large ici, mais les génériques ne sont peut-être pas la meilleure solution ici puisque vous effectuez une vérification de type à l'exécution (comme f.defaultValue.(T)).

Deuxièmement, vous semblez utiliser go 1.20, ce qui produit une erreur déroutante :

https://www.php.cn/link/63e8e3643e7f7198858eef325b0600f9

cannot use someFunc (value of type func(v bool) bool) as func(v bool) bool value in argument to f.GetVariation
Copier après la connexion

L'utilisation de la dernière version de Playground (go 1.21 au moment d'écrire ces lignes) donne des erreurs de compilation plus détaillées :

https://www.php.cn/link/2d1bcedd27b586d2a9562a0f8e076b41

./prog.go:14:29: cannot use someFunc (value of type func(v bool) bool) as func(v bool /* with bool declared at ./prog.go:13:14 */) bool /* with bool declared at ./prog.go:13:14 */ value in argument to f.GetVariation
Copier après la connexion

Indique le type bool 被指定的位置 (./prog.go:13:14) dérivé des contraintes de type.

Donc, juste parce que cette contrainte de type bool correspond à une signature de fonction non générique :

func someFunc(v bool) bool {
    return true
}
Copier après la connexion

ne signifie pas qu'il s'agit d'une correspondance de compilation exacte.

Vous pouvez "résoudre" les erreurs de compilation en utilisant cet exemple artificiel  :

func someFuncFix[T any](v T) T {
    return v
}

func (f Flag[bool]) GetBoolVariation(val bool) bool {
    return f.GetVariation(val, someFuncFix[bool])

    // FYI: `return f.GetVariation(val, someFuncFix)` also works as the bool constraint could be inferred
}
Copier après la connexion

Mais encore une fois, je pense que les génériques ne sont peut-être pas la meilleure solution pour votre cas d'utilisation spécifique.

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