Recherche de structures implémentant une interface en Go
Contexte :
En Go, nous pouvons rencontrer des scénarios où nous devons accéder dynamiquement à plusieurs structures qui implémentent une interface commune. Cependant, comme Go est un langage typé statiquement, il ne fournit pas de mécanisme intégré pour analyser toutes les structures d'un type d'interface spécifique.
Question :
Étant donné un interface avec les méthodes start() et stop(), est-il possible de récupérer une liste de toutes les structures qui implémentent cette interface ? Ces informations nous permettraient d'invoquer dynamiquement start() et stop() sur toutes les instances des structures implémentées.
Réponse :
Malheureusement, non, ce n'est pas possible directement. Le typage statique de Go élimine les définitions de type inutilisées, ce qui rend difficile l'accès aux structures qui n'ont pas été explicitement utilisées dans l'application.
Approche alternative :
Au lieu d'analyser dynamiquement les structures, un une solution alternative consiste à créer une carte ou tranche globale. Chaque structure implémentant l'interface peut ensuite ajouter une instance à cette carte lors de l'initialisation de l'application à l'aide d'une fonction init(). Cela garantit que toutes les instances des différentes structures sont accessibles et peuvent être gérées de manière centralisée.
Exemple :
<code class="go">var instMap = map[string]StartStopper type A struct {} func init() { instMap["A"] = new(A) }</code>
En itérant sur cette carte, nous pouvons invoquer dynamiquement la méthode start() sur toutes les instances enregistrées.
Considérations relatives aux instances multiples :
Si plusieurs instances de chaque type peuvent exister, vous devrez ajouter des instances à la carte manuellement chaque fois qu'ils sont créés. De plus, vous devez supprimer les instances de la carte lorsqu'elles ne sont plus nécessaires pour empêcher le Garbage Collector de les ignorer.
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!