Maison  >  Article  >  développement back-end  >  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
PHPzavant
2024-02-06 10:33:03466parcourir

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>

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>

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>

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

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

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

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
}

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
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer