3 回答
TA贡献1852条经验 获得超7个赞
我试图使用@evanmcdonnal 提供的解决方案,但我找不到一种通用的转换方式float64(这是json.Unmarshal从 json 数组解组的任何数字的类型)到 DB 中找到的任何数据类型(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()
TA贡献1809条经验 获得超8个赞
该StructTag应该有所帮助:
type Table struct {
age int `sql:"type:int;`
price float `sql:"type:float;`
}
- 3 回答
- 0 关注
- 164 浏览
添加回答
举报