4

我有几个具有相同字段 ID 的数据存储类型。是否可以创建一个通用函数来获得这个值?类似的东西?

var i interface{}
err = datastore.Get(c, key, &i)
v := reflect.ValueOf(i)
id := v.FieldByName("Id").String()

上面的代码实际上给了我一个“数据存储:无效的实体类型”错误。

4

1 回答 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

它可能不像您希望的那样简洁,但它更加类型安全,不需要反射,并说明了可用于从数据存储中获取部分数据的一般方法。

于 2012-09-04T22:45:29.657 回答