在Golang结构字段中保留类型

SivanBH:

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

我认为答案就在反射包中,但是我还没有弄清楚如何利用它。

我希望是这样的:

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")

有任何想法吗?

SivanBH:

我尝试使用@evanmcdonnal提供的解决方案,但找不到通用的转换方式float64(该类型json.Unmarshal为从json数组解组的任何数字)转换为在数据库中找到的任何数据类型(timestamp事实证明有点棘手,因为reflect.Value不会将转换方法导出到time.Time,这等效于Cassandra的timestamp)。

所做的工作是使用typeConversion字段而不是dataType字段,即持有一个将类型转换为不同列的类型的函数,将json.Unmarshal变量的类型设置为。

因此,我的结构如下所示:

type Column struct {
    name string
    typeConversion func(reflect.Value) reflect.Value
}

我已经拥有的一些typeConversion函数如下所示:

func floatToTime(varFloat reflect.Value) reflect.Value {
    timestamp := time.Unix(int64(varFloat.Float()), 0)
    return reflect.ValueOf(timestamp)
}

func floatToInt(varFloat reflect.Value) reflect.Value {
    return reflect.ValueOf(int(varFloat.Float()))
}

实际上,这确实是一个非常好的解决方案,因为它非常通用:该结构定义了构建任何转换函数的方式,这意味着我可以包装任何形式的转换以适合该API,并且返回值始终为reflect.Value,我可以通过调用来访问具有正确类型的基础值Interface(),如下所示:

// value is the data unmarshaled by json
// I convert it to reflect.Value, then convert it again using my custom typeConversion
// Then  I use Interface() to get the final value in the final (and column-appropriate) type
column.typeConversion(reflect.ValueOf(value)).Interface()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在golang中保留嵌套结构

来自分类Dev

保留名称为golang的结构字段

来自分类Dev

关于如何在结构中保留Golang指针的困惑

来自分类Dev

熊猫在结构化ndarray中保留定长char字段

来自分类Java

无法在春季启动中保留MEDIUMTEXT类型字段

来自分类Dev

在Akka中保留类型参数

来自分类Dev

在嵌套类型中保留 volatile

来自分类Dev

展平多级文件夹树结构,仅在输出中保留“文件”类型的项目

来自分类Dev

如何在golang中获取结构字段类型?

来自分类Dev

使用反射在Golang中打印结构指针字段类型

来自分类Dev

在结构中保留对 timer::guard 的引用

来自分类Dev

在 JMESPath 查询中保留层次结构

来自分类Dev

为什么要在结构中保留内存?

来自分类Dev

在Java中保留空白的jtextfield字段

来自分类Dev

在嵌套列中保留原始类型的“ tibble”

来自分类Dev

Symfony2和Selectize.js:在实体字段类型中保留新项目的最清晰方法?

来自分类Dev

Golang CSRF在struct中保存模板字段

来自分类Dev

golang从文件填充结构字段

来自分类Dev

Golang未设置结构字段

来自分类Dev

如何使用Golang Reflection获得作为切片的结构字段的类型?

来自分类Dev

在呈现给jSON之前如何将Golang结构的字段修改为其他类型?

来自分类Dev

使用webpack在输出目录中保留文件夹结构

来自分类Dev

如何在SwiftUI中保留View结构的列表?

来自分类Dev

如何在ColdFusion <2016中的结构中保留分配顺序

来自分类Dev

包含结构的golang类型数组

来自分类Dev

使用接口的字段类型设置结构字段

来自分类Dev

如何在 GET 表单中保留输入字段值的问号?

来自分类Dev

JSON与TEXT字段可在Postgres中保留值列表

来自分类Dev

如何在sqlplus的表中保留空白字段?

Related 相关文章

  1. 1

    在golang中保留嵌套结构

  2. 2

    保留名称为golang的结构字段

  3. 3

    关于如何在结构中保留Golang指针的困惑

  4. 4

    熊猫在结构化ndarray中保留定长char字段

  5. 5

    无法在春季启动中保留MEDIUMTEXT类型字段

  6. 6

    在Akka中保留类型参数

  7. 7

    在嵌套类型中保留 volatile

  8. 8

    展平多级文件夹树结构,仅在输出中保留“文件”类型的项目

  9. 9

    如何在golang中获取结构字段类型?

  10. 10

    使用反射在Golang中打印结构指针字段类型

  11. 11

    在结构中保留对 timer::guard 的引用

  12. 12

    在 JMESPath 查询中保留层次结构

  13. 13

    为什么要在结构中保留内存?

  14. 14

    在Java中保留空白的jtextfield字段

  15. 15

    在嵌套列中保留原始类型的“ tibble”

  16. 16

    Symfony2和Selectize.js:在实体字段类型中保留新项目的最清晰方法?

  17. 17

    Golang CSRF在struct中保存模板字段

  18. 18

    golang从文件填充结构字段

  19. 19

    Golang未设置结构字段

  20. 20

    如何使用Golang Reflection获得作为切片的结构字段的类型?

  21. 21

    在呈现给jSON之前如何将Golang结构的字段修改为其他类型?

  22. 22

    使用webpack在输出目录中保留文件夹结构

  23. 23

    如何在SwiftUI中保留View结构的列表?

  24. 24

    如何在ColdFusion <2016中的结构中保留分配顺序

  25. 25

    包含结构的golang类型数组

  26. 26

    使用接口的字段类型设置结构字段

  27. 27

    如何在 GET 表单中保留输入字段值的问号?

  28. 28

    JSON与TEXT字段可在Postgres中保留值列表

  29. 29

    如何在sqlplus的表中保留空白字段?

热门标签

归档