Как установить primitive.m для строки map [string] - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю с MongoDB в своем приложении Go, извлекаю некоторые данные и сохраняю их в bson.M (который. Вот пример, как получить объект bson.M из БД и затем распечатать его (давайте назовем этот объект data):

[map[_id:ObjectID("XXXXXXX") address:XX decimal:18 providers:map[currency:value] symbol:LINK]

Что мне кажется правильным.

Я думаю, что хочу l oop над картой в поле providers (как Вы можете видеть, что там тоже карта). Я делал несколько попыток, но каждый раз меня блокировали.

Из-за того, что я прочитал в документах здесь и тестирование, которое я провел, похоже, что bson.M и primitive.M одинаковы, и каждый из них рассматривается как map[string]interface{}.

Когда я пытался утвердить его в map[string]string I go a pani c ошибка:

// code run
data["providers"].(map[string]string)

//error received
panic: interface conversion: interface {} is primitive.M, not map[string]string

Причина этого в том, что я хочу l oop над полем providers, и когда я пытаюсь l oop как есть, я получаю эту ошибку:

// code to run
for key, provider := range data["providers"] {...}

// error received
cannot range over data["providers"] (map index expression of type interface{})

Я прочитал, что мне может понадобиться что-то сделать с маршалингом и декодированием, но я чувствую, что просто пропускаю шаг, чтобы понять, почему нужно сделать это, или как бы они помогли.

В любом случае подвести итог:

  1. Как сделать один l oop над примитивом. М / бсон. M / map [string] interface {}?

  2. Как преобразовать интерфейс primitive.M / bson.M / map [string] {} в строку map [string]?

Похоже, я пытаюсь сделать противоположное этой записи , и похоже, эта запись дает мне противоречивую информацию , Надеюсь отредактировать вопрос, поскольку я больше понимаю, в чем заключается моя настоящая проблема. Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Разговор с Бураком Сердаром помог дать нам ответ! Вы должны установить data["providers"] в primitive.M

for key, provider := range data["providers"].(primitive.M){...}

. Заметьте: primitive.M обрабатывается как интерфейс карты [string] {}

As Burak Serdar упомянуто, я не могу утверждать этот экземпляр primitive.M в строку map [string], потому что interface в map[string]interface{} имеет тип primitive.M. Поэтому вместо этого я должен присвоить объект providers объекту primitive.M, и тогда я смогу нормально его обработать.

Я не могу преобразовать примитив.M в карту [строка] строка

0 голосов
/ 22 апреля 2020

Утверждение типа для map[string]interface{} до map[string]string потерпит неудачу, поскольку это тип утверждение , а не тип преобразование . Он только проверяет, является ли тип интерфейса тем, чем вы думаете, и в данном случае это не так. Вы должны выполнить итерацию map[string]interface{} и ввести значения:

for k,v:=range data.(primitive.M)["providers"] {
   if str, ok:=v.(string); ok {
      // Use k and str
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...