Go Generics : débloquer des méthodes partagées dans les unions de types
Dans la nouvelle fonctionnalité générique de Go, la contrainte d'union de types permet de lier plusieurs types à un seul paramètre de type générique. Cependant, la question se pose : comment utiliser les méthodes partagées entre ces types ?
Tentative initiale et erreur du compilateur
<br>interface de type AB { </p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">*A | *B
}
func (a *A) some() booléen {
return true
}
func (b *B) some() bool {
return false
}
func some[T AB] (x T) booléen {
return x.some() // undefined
}
Le code ci-dessus tente d'utiliser la méthode shared some dans la fonction some, mais rencontre une erreur, car le compilateur ne peut pas déterminer lequel une méthode à appeler.
Solution de contournement utilisant la contrainte d'interface
Pour surmonter ce problème limitation, la méthode partagée peut être ajoutée directement à la contrainte d'interface :
<br>type AB interface {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">*A | *B some() bool
}
func some[ T AB](x T) booléen {
return x.some() // works
}
Cela garantit que le type générique T doit satisfaire la contrainte d'interface, qui inclut la méthode some.
Limitation dans Go 1.18
Il est important de noter que cette solution de contournement est temporaire mesure due à une restriction dans Go 1.18. Les spécifications Go autorisent l'utilisation de méthodes partagées dans les unions de types, mais l'implémentation actuelle du compilateur la limite aux méthodes explicitement déclarées dans l'interface de contrainte.
Résolution dans Go 1.19
Les notes de version de Go 1.18 reconnaissent cette limitation et expriment leur intention de la supprimer dans Go 1.19, permettant un accès direct aux méthodes partagées dans les unions de types. Cette amélioration renforcera l'expressivité et la flexibilité des génériques Go.
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!