У меня есть следующая структура
type MyEntity struct {
PF []byte `json:"-" datastore:"_pf"`
}
Запросы без проекции работают нормально. Однако, когда я запрашиваю с проекцией на поле "_pf", я получаю ошибку "несоответствие типов: строка против [] uint8". Я реализовал PropertyLoadSaver и проверил свойство prop.Value "_pf" и обнаружил, что некоторые строки возвращают тип байта [], а некоторую возвращаемую строку. Итак, почему проецируемый запрос терпит неудачу с этой ошибкой, тогда как непрогнозируемые запросы в порядке? В настоящий момент я решаю эту проблему путем реализации интерфейса PropertyLoadSaver и явной проверки типов и преобразования строкового типа в тип байта [] для решения этой проблемы.
Вот полный тестовый пример. Это воспроизводится на эмуляторе облачного хранилища данных. Используйте соответствующее значение для переменной datastoreProject ниже. Остальное все должно работать напрямую. Вы можете увидеть поведение, вставив обе сущности или один из типов сущностей. Отображаемая ошибка:
panic: datastore: cannot load field "_pf" into a "tests.MyEntity": type mismatch: string versus []uint8 [recovered]
panic: datastore: cannot load field "_pf" into a "tests.MyEntity": type mismatch: string versus []uint8
Ниже приведен код.
type MyEntity struct {
PF []byte `json:"-" datastore:"_pf"`
}
func TestPackedField(t *testing.T) {
e1 := &MyEntity{PF: []byte{83, 0, 0, 0, 93, 150, 154, 206, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 3}} // returns []byte on projection
e2 := &MyEntity{PF: []byte{83, 0, 0, 0, 93, 120, 79, 87, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 3}} // returns string on projection
ctx := context.Background()
conn, err := datastore.NewClient(ctx, datastoreProject)
if err != nil {
panic(err)
}
bkey := datastore.NameKey("Bytes", "bytearray", nil)
if true {
conn.Put(ctx, bkey, e1)
}
skey := datastore.NameKey("Bytes", "string", nil)
if true {
conn.Put(ctx, skey, e2)
}
q1 := datastore.NewQuery("Bytes").Order("-_pf").Limit(2)
var elfull []*MyEntity
if _, err := conn.GetAll(ctx, q1, &elfull); err != nil {
panic(err)
}
q2 := datastore.NewQuery("Bytes").Project("_pf").Order("-_pf").Limit(2)
var elprojected []*MyEntity
if _, err := conn.GetAll(ctx, q2, &elprojected); err != nil {
conn.Delete(ctx, bkey)
conn.Delete(ctx, skey)
panic(err)
}
}