map [string] interface {}的类型化嵌套映射返回“type interface {}不支持索引”

时间:2017-11-21 12:26:10

标签: go

我遇到了类型化嵌套地图的一个非常奇怪的问题。

gore version 0.2.6  :help for help
gore> type M map[string]interface{}
gore> m := M{"d": M{}}
main.M{"d":main.M{}}
gore> m["d"]["test"] = "will fail"
# command-line-arguments
/tmp/288178778/gore_session.go:13:8: invalid operation: m["d"]["test"] (type interface {} does not support indexing)
/tmp/288178778/gore_session.go:14:17: invalid operation: m["d"]["test"] (type interface {} does not support indexing)
error: exit status 2
exit status 2
gore> m["e"] = "this works"
"this works"
gore> m
main.M{"d":main.M{}, "e":"this works"}

我做错了什么?为什么这只是因为地图嵌套在地图中而突然失败?

1 个答案:

答案 0 :(得分:1)

我们来看看:

import React from 'react'
import { Fields, FormSection } from 'redux-form'

const renderAddreessInputs = ({ street, number, error }) => (<div>
  <input {...street.input} type="text" />
  <input {...number.input} type="text" />
  { street.meta.touched && number.meta.touched && error && <span className="error">{error}</span> }
</div>)

const MultiInputText = (props) => {
  const { input: { name }, label, meta: { error }} = props
  const names = [
    'street',
    'number'
  ]

  return (<div>
    <label htmlFor={name}>{label}</label>
    <FormSection name={name}>
      <Fields names={names} component={renderAddreessInputs} error={error}/>
    </FormSection>
  </div>)
}

export default MultiInputText

定义foo:=map[string]interface{}{} 时,您可以为给定的字符串索引设置您想要的任何类型(满足empty interface map[string]interface{}契约的任何类型,也称为任何类型)。

interface{}

但是当你尝试访问某些键时,你没有得到一些int,string或任何自定义结构,你得到一个foo["bar"]="baz" foo["baz"]=1234 foo["foobar"]=&SomeType{}

interface{}

要将var bar string = foo["bar"] // error 视为字符串,您可以制作type assertiontype switch

这里我们选择类型断言(live example):

bar

但正如@Volker所说,作为初学者,让tour of go更熟悉这些概念是一个好主意。