2016-04-05 4 views
0

Из 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{}, но когда я попытался проверить на ходу игровой площадки, я не могу инициализировать подобную структуру данных: https://play.golang.org/p/7QKYaQPi6g

Мой вопрос, поэтому вдвойне:

  1. Что такое тип https://play.golang.org/p/7QKYaQPi6g (при условии, что я не ошибся в своих рассуждениях)
  2. Что я делаю неправильно в x := {"foo": 1, "bar": 1}?

ответ

2

bson.M это просто другое название для map[string]interface{}. См. Его documentation. Его объявлен,

type M map[string]interface{} 

Так что, да {"$match": bson.M{"name": "Otavio"} имеет тип bson.M

+2

Единственное, что я не думал проверять ... это не один из моих самых ярких вопросов ... Спасибо! – blz

1
x := {"foo": 1, "bar": 1} 

В этом заявлении нет никаких шансов удержать тип. Когда вы делаете что-то вроде этого:

[]bson.M{{"$match": bson.M{"name": "Otavio"}}} 

компилятора знает, что вы инициализация кусочка определенного типа, поэтому нет необходимости повторять этот тип каждый раз (если это не интерфейс). Это initalisation называется composite literals и был введен в go1.0

+0

Ах, но, конечно же! С другой стороны, я все еще в тупике по отношению к типу литерала, так как я предполагаю '{" $ match ": bson.M {" name ":" Otavio "}}' не относится к типу ' bson.M'. – blz

+0

['bson.M'] (https://godoc.org/labix.org/v2/mgo/bson#M) - это просто' map [string] interface {} '. Так что в вашем случае это отображение строки в другую 'bson.M' – janisz

Смежные вопросы