将数据存储区实体放入Go中的接口

sat*_*hvj 4 go google-cloud-datastore

我有几个具有相同字段ID的数据存储区.是否有可能创建一个可以获得此值的通用函数?有类似的东西吗?

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

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

Jer*_*all 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
Run Code Online (Sandbox Code Playgroud)

它可能不是尽量精简你希望,但它是一个有点多类型安全的,不需要思考,并说明你可以用它来获取部分数据进行数据存储的通用方法.