【问题标题】:Casting Interface{} to specific Type将 Interface{} 转换为特定类型
【发布时间】:2014-04-04 18:19:54
【问题描述】:

我正在尝试创建一个通用函数来保存到数据存储区。以下两个示例中的第二个有效,但第一个给了我“数据存储:无效的实体类型”错误。

目前我对 Go 非常无知,但我试图减少我的无知。有没有办法将第一个示例中的对象转换为名称保存在字符串中的类型。例如某种反射。我尝试了 reflect.ValueOf,但失败了。

提前致谢

示例 1:

func save(kind string, c.appengine.Context, object interface{}) {
    k := datastore.NewKey(c, kind, "some_key", 0, nil)
    _, err := datastore.Put(c, k, &object)
}
save("MyType", c, someMyTypeObject)

示例2:

func save(kind string, c.appengine.Context, object MyType) {
    k := datastore.NewKey(c, kind, "some_key", 0, nil)
    _, err := datastore.Put(c, k, &object)
}
save("MyType", c, someMyTypeObject)

【问题讨论】:

  • Ref Type Assertions(类似于 Java 或 C# 中的引用类型转换) - 请注意在赋值期间使用时的区别。
  • 谢谢,但我还是不明白。据我了解,第一个 datastore.Put 失败,因为对象的类型为“interface{}”。所以我需要将它转换为类型“MyType”(在字符串“kind”中定义)。查看您引用的页面,我看不到类似的内容。我厚吗?感谢您的耐心等待。
  • 哦。是的 - 不。不是这样的。无法使用运行时值来确定编译时/静态类型信息。您将不得不接受更通用的合同(例如interface{},但它可能会更精细),使用某种形式的详尽映射(即类型断言)关闭值,或者使用反射相关的调用。基本上,一个不能添加基于值的静态类型信息。
  • 请注意,Go 中没有“类型转换”之类的东西:只有“类型 conversions”。 这不是挑剔:Go 强调没有隐式类型转换和因此,进行任何转换都必须是有意识的决定。

标签: google-app-engine go


【解决方案1】:

datastore.Put 将结构指针作为其第三个参数,但您将指针传递给在这种情况下无效的接口。

要解决这个问题,您需要在调用 save 时传递一个指针,并将其按原样传递给 datastore.Put

func save(kind string, c appengine.Context, object interface{}) {
    k := datastore.NewKey(c, kind, "some_key", 0, nil)
    _, err := datastore.Put(c, k, object)
}
save("MyType", c, &someMyTypeObject)

您可以将其视为通过savesomeMyTypeObject 传递给datastore.Put,而save 并不知道它是什么。

【讨论】:

  • 谢谢。这正是我所希望的。
猜你喜欢
  • 2021-05-11
  • 2014-06-16
  • 2017-01-17
  • 1970-01-01
  • 2016-10-15
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多