I am developing a simple console game to learn go and got stuck on a seemingly simple problem that is not found in other languages There is no problem in Go, but it seems almost impossible in Go.
I have an interface mapped as a field in a struct like this:
type room struct { // ... components map[string]interface{} // ... }
I need to iterate over the map and call the render()
method for each item stored in the map (assuming they all implement the render()
method. For example in js or php, This wouldn't be a problem, but I've been banging my head against the wall all day in go.
I need something like this:
for _, v := range currentroom.components { v.render() }
This didn't work, but when I specified the type and manually called each item individually, it worked:
currentRoom.Components["menu"].(*List.List).Render() currentRoom.Components["header"].(*Header.Header).Render()
How to call the render()
method for each item in the map? Or if there is a better/different way to solve this problem please enlighten me as I'm at my wits' end here.
Define interface:
type renderable interface { render() }
You can then type assertion map elements and call render as long as they implement that method:
currentroot.components["menu"].(renderable).render()
To test whether something is renderable, use:
renderable, ok:=currentRoot.Components["menu"].(Renderable) if ok { renderable.Render() }
The above is the detailed content of Iterate over the map of 'interface{}' and call the same method on every item in Golang. For more information, please follow other related articles on the PHP Chinese website!