符号x.(T) 称为Type Assertion。
对于接口类型的表达式x 和T 类型,主表达式x.(T) 断言x 不是nil,并且存储在x 中的值是T 类型.
你的例子:
result["args"].(map[string]interface{})["foo"]
这意味着与键 "args" 关联的 results 映射的值是 map[string]interface{} 类型(另一个具有 string 键和任何值的映射)。并且您想访问与键 "foo" 关联的该映射的元素。
如果您知道输入 JSON 格式,那么是的,您必须使用通用的 map[string]interface{} 类型来处理它。如果您知道输入 JSON 的确切结构,则可以创建一个 struct 来匹配预期字段,然后您可以将 JSON 文本解组为您的自定义 struct 类型的值,例如:
type Point struct {
Name string
X, Y int
}
func main() {
in := `{"Name":"center","X":2,"Y":3}`
pt := Point{}
json.Unmarshal([]byte(in), &pt)
fmt.Printf("Result: %+v", pt)
}
输出:
Result: {Name:center X:2 Y:3}
在Go Playground 上试用。
为您的输入建模
您当前的 JSON 输入可以用这种类型建模:
type Data struct {
Args struct {
Foo string
}
}
并访问Foo(在Go Playground) 上尝试:
d := Data{}
json.Unmarshal([]byte(in), &d)
fmt.Println("Foo:", d.Args.Foo)