这个文字的类型是什么?

时间:2016-04-05 14:00:41

标签: go

来自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

因此我的问题有两个:

  1. https://play.golang.org/p/7QKYaQPi6g的类型是什么(假设我在推理中没有犯错)
  2. 我在x := {"foo": 1, "bar": 1}中做错了什么?

2 个答案:

答案 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

中引入