Je suis nouveau sur Golang et je travaille sur la structure suivante :
<code>type Flag[T any] struct { defaultValue interface{} } </code>
Parmi eux T
可以是 int
或 bool
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 ?
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!