来自mgo
文档:
pipe := collection.Pipe([]bson.M{{"$match": bson.M{"name": "Otavio"}}})
分解此语句,我发现传递给collection.Pipe
的参数的类型为[]bson.M
。鉴于切片是通过[]sometype{ ... }
语法初始化的,我得出结论,前面提到的切片只包含一个项(所以len == 1
),并且该项是{"$match": bson.M{"name": "Otavio"}}
文字。
这个文字的类型是什么?直觉上,我想说它是map[string]interface{}
,但当我尝试在go操场上查看时,我无法初始化类似的数据结构:https://play.golang.org/p/7QKYaQPi6g
因此我的问题有两个:
https://play.golang.org/p/7QKYaQPi6g
的类型是什么(假设我在推理中没有犯错)x := {"foo": 1, "bar": 1}
中做错了什么?答案 0 :(得分:2)
bson.M
只是map[string]interface{}
的另一个名称。见其documentation。它被宣布为,
type M map[string]interface{}
所以,是{"$match": bson.M{"name": "Otavio"}
的类型为bson.M
答案 1 :(得分:1)
x := {"foo": 1, "bar": 1}
在此声明中,没有机会扣除该类型。当你做这样的事情时:
[]bson.M{{"$match": bson.M{"name": "Otavio"}}}
编译器知道您正在初始化特定类型的切片,因此不需要每次都重复此类型(除非它的接口)。这种初始化称为composite literals,并在go1.0
中引入