gpt4 book ai didi

google-cloud-datastore - 将数据存储实体放入 Go 中的接口(interface)中

转载 作者:IT王子 更新时间:2023-10-29 00:38:11 25 4
gpt4 key购买 nike

我有几个具有相同字段 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 接口(interface)的自定义类型来解决问题,如下所示:

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

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

关于google-cloud-datastore - 将数据存储实体放入 Go 中的接口(interface)中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12271836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com