【问题标题】:Datastore invalid value type for a Property with name具有名称的属性的数据存储区值类型无效
【发布时间】:2022-01-06 17:30:32
【问题描述】:

我正在尝试使用 GoLang 中的 PropertyList 将 int64 数组保存到 Datastore。

这是 PropertyList 中的属性:

但是,我收到此错误:

我知道您可以在 Datastore 中存储数组,尤其是原始数组。所以当我试图通过 PropertyList 插入它时,我不确定我做错了什么。我的所有其他属性都得到了正确保存(它们只是单个基元)。数组导致了这个问题。

【问题讨论】:

  • 您是否阅读过关于Value 字段的文档?它确实列出了有效的类型。它还提到它接受[]interface{},所以也许尝试将您的[]int64 转换为[]interface{},看看这是否足以让它工作。 go.dev/doc/faq#convert_slice_of_interface
  • @mkopriva 啊,看起来它接受了一个[]interface{},它支持原始数据类型。我将尝试将我的[]int64 转换为[]interface{},看看它是否有效。谢谢
  • @mkopriva 成功了,100% ????谢谢

标签: arrays go google-cloud-platform properties google-cloud-datastore


【解决方案1】:

解决了!感谢@mkopriva 的帮助。

如果要保存任何受支持的 Datastore 数据类型的数组,则必须将该数组的每个元素附加到新的 interface{} 数组中。 Value Field Documentation

我编写了这个反射函数来处理 any 切片类型:

src := []int64{1, 2, 3, 4, 5}
value := reflect.ValueOf(src)
kind := value.Kind()
switch kind {
case reflect.Slice:
    interfaceArr := make([]interface{},0)
    for i := 0; i < value.Len(); i++ {
        interfaceArr = append(interfaceArr, value.Index(i).Interface())
    }
    return interfaceArr
}

以下是数组属性在属性列表中的正确显示方式:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 2018-01-18
    • 2022-06-12
    • 2015-08-05
    相关资源
    最近更新 更多