Я только начал разрабатывать приложение GAE со средой выполнения Go, пока это было приятно. Однако я столкнулся со следующей неудачей:
Я пользуюсь гибкостью, которую обеспечивает хранилище данных, поскольку несколько разных структур с разными свойствами сохраняются под одним и тем же именем объекта («Элемент»). Ссылка на хранилище данных языка Go *1003* 1004 * гласит, что «фактические передаваемые типы не должны совпадать между вызовами Get и Put или даже между различными запросами App Engine», поскольку сущности на самом деле являются просто набором свойств и поэтому могут храниться в соответствующем типе контейнера, который может их поддерживать.
Мне нужно запросить все сущности, хранящиеся под именем сущности «Item», и закодировать их как JSON одновременно. Используя эту гибкость свойства сущности в моём преимуществе, можно сохранять запрашиваемые сущности в произвольных datastore.PropertyList
, однако функции Get
и GetAll
возвращают ErrFieldMismatch
как ошибку, когда свойство запрашиваемых сущностей не может быть должным образом представлены (то есть несовместимые типы или просто отсутствующее значение). Все эти структуры, которые я сохраняю, создаются пользователем, и большинство значений являются необязательными, поэтому в хранилище данных сохраняются пустые значения. При сохранении этих структур с пустыми значениями проблем нет (снова гибкость хранилища данных), но есть при их получении.
В документации Go хранилища данных также указано, что вызывающий метод Get
должен сам решать, являются ли ошибки, возвращаемые из-за пустых значений, игнорируемыми, восстанавливаемыми или фатальными. Я хотел бы знать, как правильно сделать это, поскольку простого игнорирования ошибок будет недостаточно, поскольку структуры назначения (datastore.PropertyList
) моих запросов вообще не заполняются, когда запрос приводит к этой ошибке.
Заранее спасибо, и извините за длинный вопрос.
Обновление: вот код
query := datastore.NewQuery("Item") // here I use some Filter calls, as well as a Limit call and an Order call
items := make([]datastore.PropertyList, 0)
_, err := query.GetAll(context, &items) // context has been obviously defined before
if err != nil {
// something to handle the error, which in my case, it's printing it and setting the server status as 500
}
Обновление 2: вот какой-то вывод
Если я использую make([]datastore.PropertyList, 0)
, я получаю это:
datastore: invalid entity type
И если я использую make(datastore.PropertyList, 0)
, я получаю это:
datastore: cannot load field "Foo" into a "datastore.Property": no such struct field
И в обоих случаях (первый, я полагаю, можно отбросить) в items
я получаю это:
[]