【发布时间】:2019-10-08 18:01:55
【问题描述】:
我有一个结构如下
type MyEntity struct {
PF []byte `json:"-" datastore:"_pf"`
}
没有投影的查询工作正常。但是,当我在“_pf”字段上使用投影进行查询时,出现“类型不匹配:字符串与 []uint8”错误。我实现了 PropertyLoadSaver 并检查了“_pf”属性的 prop.Value,发现有些行返回 []byte 类型和一些返回字符串。那么,为什么投影查询失败并出现此错误,而非投影查询很好?目前我正在通过实现 PropertyLoadSaver 接口并显式检查类型并将字符串类型转换为 []byte 类型来解决此问题。
这是完整的测试用例。这是在云数据存储模拟器上复制的。为下面的 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)
}
}
【问题讨论】:
-
能否请您提供一些代码,您在哪里进行投影查询?您能否也举一些数据示例?什么返回[]byte,什么返回string?
-
谢谢安德烈。用测试用例和示例数据更新了帖子。