我遇到了类型化嵌套地图的一个非常奇怪的问题。
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"}
我做错了什么?为什么这只是因为地图嵌套在地图中而突然失败?
答案 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 assertion或type switch。
这里我们选择类型断言(live example):
bar
但正如@Volker所说,作为初学者,让tour of go更熟悉这些概念是一个好主意。