符号
x.(T)
被称为
类型断言。
对于一个接口类型的表达式
x
和一个类型
T
,主要表达式
x.(T)
断言
x
不是
nil
,并且存储在
x
中的值是类型
T
。
你的示例:
result["args"].(map[string]interface{})["foo"]
这意味着你的
results
映射与键
"args"
相关联的值是
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)
foo
是interface{}
类型,那么执行string(foo)
和foo.(string)
有什么区别? - Sreejith Ramakrishnaninterface{}
是一个空接口,符合条件),关于转换的规则请参阅规范:Conversions。在您的情况下,您只能使用类型断言而不能使用转换。 - icza