我有几个具有相同字段 ID 的数据存储类型。是否可以创建一个通用函数来获得这个值?类似的东西?
var i interface{}
err = datastore.Get(c, key, &i)
v := reflect.ValueOf(i)
id := v.FieldByName("Id").String()
上面的代码实际上给了我一个“数据存储:无效的实体类型”错误。
我有几个具有相同字段 ID 的数据存储类型。是否可以创建一个通用函数来获得这个值?类似的东西?
var i interface{}
err = datastore.Get(c, key, &i)
v := reflect.ValueOf(i)
id := v.FieldByName("Id").String()
上面的代码实际上给了我一个“数据存储:无效的实体类型”错误。
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
它可能不像您希望的那样简洁,但它更加类型安全,不需要反射,并说明了可用于从数据存储中获取部分数据的一般方法。