reflection - 在 Golang 结构字段中保存类型

标签 reflection struct go

我正在寻找一种方法来将类型(也许是 reflection.Type?)保存为自定义结构中的字段。这背后的原因是我将 JSON 数组解码为结构,稍后我将根据这些结构构建 SQL 查询,但 JSON 数组中的整数、 float 和时间戳是相同的,尽管它们在查询数据库时不同。这意味着我需要在查询之前将每个值转换为正确的类型。

我认为答案在 reflect 包的某个地方,但我还没有弄清楚如何使用它。

我希望的是这样的:

type Column struct {
    name string
    dataType type
}
someColumn := Column {name: "somecol", dataType: int}
convertedVal := SomeConversionFunc("5", someColumn.dataType)

或者,这种事情也可以工作:

type Column struct {
    name string
    dataType func()
}
someColumn := Column {name: "somecol", dataType: ConvertToInt}
convertedVal := someColumn.dataType("5")

有什么想法吗?

最佳答案

我想你走在正确的轨道上。在您的 Column 结构中,您正在寻找 reflect.Type。您将通过 import "reflect" 获得。

如果您的列结构包含类型名称和值(作为原始字符串),您应该能够编写方法来切换类型并为每种情况生成正确类型的值。此处开关的简要引用; https://golang.org/doc/effective_go.html#switch

type Column struct {
    Name string
    DataType reflect.Type
    TypedValue interface{}
    StringValue string
}

因为你说“但是整数、 float 和时间戳在 JSON 数组中是相同的”我假设你的 json 中的所有值在技术上都是字符串(意味着它们都被引用)。您可能不需要所有这些字段,但想法是将类型信息与属性名称和原始值相结合。如果您使用 interface{} 类型的字段,您可以为其分配任何内容,以便您可以保存原始 json 数据(名称和值)以及类型信息和合理的 Go 类型中的值在这个结构的一个实例中很容易。

关于reflection - 在 Golang 结构字段中保存类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31705784/

相关文章:

java - 如何使用非通用参数调用方法(反射)?

c# - 通过缓存或委托(delegate)调用提高性能?

c# - GetProperty BindingFlags.IgnoreCase 在 c# 中没有 public 和 Instance 将无法工作

python : Socket Sending Struct(having C stuct as Example)

go - defer 语句是如何工作的

xml - 在 Go 中解析 SOAP

c++ - 使用 GCC 编译没有 RTTI 的时间 typeid

c# - 使用 COM 将结构或字符串数​​组从 C++ 传递到 C#

c++ - 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

syntax - Go "import"语法是不是特别独特?