将Datastore实体转换为Go语言中的接口

4
我有几个数据存储Kinds,它们都有相同的字段ID。是否可能创建一个通用函数来获取此值?类似于以下内容:
var i interface{}
err = datastore.Get(c, key, &i)
v := reflect.ValueOf(i)
id := v.FieldByName("Id").String()

以上代码在现有状态下会出现“数据存储:无效实体类型”的错误。
1个回答

8

var i interface{} 没有任何具体的类型。由于使用了反射,appengine数据存储需要将数据反序列化为具体类型。从文档中看来,缺少字段或字段类型与存储数据不同也会导致错误返回,因此您不能仅定义ID字段的结构。

即使如此,您仍然可以使用实现PropertyLoadSaver接口的自定义类型来解决问题,例如:

type IdField struct {
  Id string
}

function (f *IdField) Load(ch <-chan Property) error {
  for p := range ch {
    if p.Name == "Id" {
      f.Id = p.Value.(string)
    }
  }
  return nil
}

function (f *IdField) Save(ch chan<- Property) error {
   return fmt.Errorf("Not implemented")
}

var i = &IdField{}
err := datastore.Get(c, key, i)
id := i.Id

这段话可能没有您期望的那么简洁,但它更加类型安全,不需要反射,并且展示了您可以使用的一般方法来从数据存储中获取部分数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接