Simultanéité d'interface/implémentation dans Golang Generics
Considérez la tâche de création d'une fonction générique pour remplir une tranche avec des valeurs initialisées. Bien que cela puisse sembler simple, des défis surviennent lorsque l'on tente d'utiliser des tranches d'interfaces et de spécifier des types concrets au sein de la fonction.
Dans Go 1.18, contraindre X et Y comme n'importe quel type dans la fonction générique Fill entraîne une perte de toute relation entre l'interface et ses implémenteurs. Cela empêche l'affectation d'instances de Y à slice[i] au sein de la fonction.
Pour surmonter cela, une assertion explicite peut être utilisée :
<code class="go">func Fill[X, Y any](slice []X) { for i := range slice { slice[i] = any(*new(Y)).(X) } }</code>
Cependant, cette approche panique lorsque Y n'implémente pas X. De plus, l'utilisation d'un type de pointeur pour Y entraîne la perte d'informations sur le type de base et une valeur de base nulle.
Pour résoudre ces problèmes, il est recommandé d'utiliser une fonction constructeur au lieu de un deuxième paramètre de type :
<code class="go">func main() { xs := make([]sync.Locker, 10) Fill(xs, func() sync.Locker { return &sync.Mutex{} }) } func Fill[X any](slice []X, f func() X) { for i := range slice { slice[i] = f() } }</code>
Cette approche remplit efficacement la tranche avec des valeurs initialisées créées par la fonction constructeur, offrant une solution plus robuste et flexible au problème.
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!