"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > **Comment préserver les relations interface-implémenteur lors de l'utilisation de génériques dans Go pour l'initialisation de tranche ?**

**Comment préserver les relations interface-implémenteur lors de l'utilisation de génériques dans Go pour l'initialisation de tranche ?**

Publié le 2024-11-05
Parcourir:975

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

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.

Dernier tutoriel Plus>

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