I'm not sure if you have control over what page.Metadata
does, but if you do, a better way is available for this situation. Say your code looks like this:
package main
import (
"encoding/json"
"log"
)
func Metadata() (interface{}, error) {
y := []byte(`{"metadata": {"title": "Stack Overflow"}}`)
var m map[string]interface{}
e := json.Unmarshal(y, &m)
if e != nil {
return nil, e
}
return m["metadata"], nil
}
func main() {
m, e := Metadata()
if e != nil {
log.Fatal(e)
}
s := m["title"]
println(s == "Stack Overflow")
}
You'd get the same error you got. But you can change it to this:
type Map map[string]interface{}
func (m Map) M(s string) Map {
return m[s].(map[string]interface{})
}
func (m Map) S(s string) string {
return m[s].(string)
}
func Metadata() (Map, error) {
y := []byte(`{"metadata": {"title": "Stack Overflow"}}`)
var m Map
e := json.Unmarshal(y, &m)
if e != nil {
return nil, e
}
return m.M("metadata"), nil
}
func main() {
m, e := Metadata()
if e != nil {
log.Fatal(e)
}
s := m.S("title")
println(s == "Stack Overflow")
}
Then whenever you need to index, you just call the appropriate method depending on what you are wanting to return. You can also add Slice if need be []interface{}
, and further methods from what I put, for example if you need to return integer. Finally, if you want to check if Map contains key, you can do this:
if m["title"] != nil {
s := m.S("title")
println(s == "Stack Overflow")
}