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] dans la fonction.
Pour surmonter cela, une assertion explicite peut être utilisée :
func Fill[X, Y any](slice []X) {
for i := range slice {
slice[i] = any(*new(Y)).(X)
}
}
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 pour résoudre ces problèmes, il est recommandé d'utiliser une fonction constructeur au lieu d'un deuxième paramètre de type :
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()
}
}
Cette approche remplit efficacement la tranche avec les valeurs initialisées créées par la fonction constructeur, offrant une solution plus robuste et flexible au problème.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3