首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取无效操作:尝试为地图编制索引时,mymap["title"] (type interface {}不支持索引)

获取无效操作:尝试为地图编制索引时,mymap["title"] (type interface {}不支持索引)
EN

Stack Overflow用户
提问于 2014-08-09 08:23:39
回答 2查看 46.2K关注 0票数 52

我有一个map中的数据,我想通过key索引到map中,以获得一个值。

代码语言:javascript
复制
mdi, err := page.Metadata()
fmt.Println(mdi["title"])

然而,我一直收到错误消息invalid operation: mdi["title"] (type interface {} does not support indexing)。我很困惑,因为数据是一张地图,我应该能够对其进行索引以获得值。在类型不明确的情况下,我还尝试将值转换为字符串:

代码语言:javascript
复制
title, ok := mdi["title"].(string)
checkOk(ok)
fmt.Println(title)

但是,我得到了相同的错误消息。我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-09 08:23:39

这里的数据类型是关键。mdi实际上不是一个映射,而是一个interface{},它可以是任何东西--映射、字符串、整型。您需要首先将其断言为具有预期的键/值类型的映射,或者执行JSON and Go中概述的笨拙的case开关。

代码语言:javascript
复制
mdi, err := page.Metadata()
md, ok := mdi.(map[string]interface{})
fmt.Println(md["title"])
票数 95
EN

Stack Overflow用户

发布于 2020-12-18 06:08:18

我不确定您是否可以控制page.Metadata所做的事情,但是如果您这样做了,就会有一种更好的方法来解决这种情况。假设你的代码是这样的:

代码语言:javascript
复制
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")
}

你会得到和你一样的错误。但您可以将其更改为:

代码语言:javascript
复制
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,你可以这样做:

代码语言:javascript
复制
if m["title"] != nil {
   s := m.S("title")
   println(s == "Stack Overflow")
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25214036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档