Maison  >  Article  >  développement back-end  >  Parcourez la carte de "interface{}" et appelez la même méthode sur chaque élément de Golang

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

王林
王林avant
2024-02-05 11:57:54599parcourir

迭代“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{}
    // ...
}

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()
}

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()

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()
}

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

currentroot.components["menu"].(renderable).render()

Pour tester si quelque chose est rendu, utilisez :

renderable, ok:=currentRoot.Components["menu"].(Renderable)
if ok {
   renderable.Render()
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer