我有一个map中的数据,我想通过key索引到map中,以获得一个值。
mdi, err := page.Metadata()
fmt.Println(mdi["title"])
然而,我一直收到错误消息invalid operation: mdi["title"] (type interface {} does not support indexing)
。我很困惑,因为数据是一张地图,我应该能够对其进行索引以获得值。在类型不明确的情况下,我还尝试将值转换为字符串:
title, ok := mdi["title"].(string)
checkOk(ok)
fmt.Println(title)
但是,我得到了相同的错误消息。我做错了什么?
发布于 2014-08-09 08:23:39
这里的数据类型是关键。mdi
实际上不是一个映射,而是一个interface{}
,它可以是任何东西--映射、字符串、整型。您需要首先将其断言为具有预期的键/值类型的映射,或者执行JSON and Go中概述的笨拙的case
开关。
mdi, err := page.Metadata()
md, ok := mdi.(map[string]interface{})
fmt.Println(md["title"])
发布于 2020-12-18 06:08:18
我不确定您是否可以控制page.Metadata
所做的事情,但是如果您这样做了,就会有一种更好的方法来解决这种情况。假设你的代码是这样的:
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")
}
你会得到和你一样的错误。但您可以将其更改为:
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")
}
然后,当您需要索引时,您只需根据您想要返回的内容调用适当的方法。如果需要[]interface{}
,你也可以添加Slice,以及我所放的更多方法,例如,如果你需要返回整数。最后,如果你想检查Map是否包含key,你可以这样做:
if m["title"] != nil {
s := m.S("title")
println(s == "Stack Overflow")
}
https://stackoverflow.com/questions/25214036
复制相似问题