Maison > développement back-end > Golang > le corps du texte

Parcourez la carte de 'interface{}' et appelez la même méthode sur chaque élément de Golang

王林
Libérer: 2024-02-05 11:57:54
avant
612 Les gens l'ont consulté

迭代“interface{}”的映射并在 Golang 中的每个项目上调用相同的方法

Contenu de la question

Je développe un jeu de console simple pour apprendre le go et je suis resté bloqué sur un problème apparemment simple qui ne pose pas de problème dans d'autres langues mais qui semble presque impossible en go.

J'ai une interface mappée sous forme de champ dans une structure comme celle-ci :

type room struct {
    // ...
    components map[string]interface{}
    // ...
}
Copier après la connexion

Je dois parcourir la carte et appeler la méthode render() 方法(假设它们都实现 render() pour chaque élément stocké dans la carte. Par exemple en js ou en php, cela ne poserait pas de problème, mais en go, je me cogne la tête contre le mur toute la journée.

J'ai besoin de quelque chose comme ça :

for _, v := range currentroom.components {
    v.render()
}
Copier après la connexion

Cela n'a pas fonctionné, mais lorsque j'ai spécifié le type et appelé manuellement chaque élément individuellement, cela a fonctionné :

currentRoom.Components["menu"].(*List.List).Render()
currentRoom.Components["header"].(*Header.Header).Render()
Copier après la connexion

Comment appeler la méthode render() sur chaque élément de la carte ? Ou s'il existe une manière meilleure/différente de résoudre ce problème, veuillez m'éclairer car je suis à bout de nerfs ici.


Bonne réponse


Définir l'interface :

type renderable interface {
   render()
}
Copier après la connexion

Vous pouvez ensuite taper assert map elements et appeler render tant qu'ils implémentent cette méthode :

currentroot.components["menu"].(renderable).render()
Copier après la connexion

Pour tester si quelque chose est rendu, utilisez :

renderable, ok:=currentRoot.Components["menu"].(Renderable)
if ok {
   renderable.Render()
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal