分享
  1. 首页
  2. 主题
  3. Go问与答

golang reflect 获取time

shileislslsl · · 1470 次点击 · 开始浏览 置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

最近想写一个将gorm model 转成普通struct的工具,通过gorm的tag和json 进行匹配赋值 现在我想问一下,怎么把time.Time类型的值获取到? 可能描述没有很清楚,看代码: ``` func CoverModelToStruct(model, dest interface{}) error { v := reflect.ValueOf(dest).Elem() if !v.CanAddr() { return fmt.Errorf("must be a pointer") } m := reflect.ValueOf(model).Elem() if !m.CanAddr() { return fmt.Errorf("must be a pointer") } for i := 0; i < v.NumField(); i++ { fieldDest := v.Type().Field(i) tagJson := fieldDest.Tag.Get("json") if tagJson == "" || tagJson == "-" { continue } for j := 0; j < m.NumField(); j++ { fieldModel := m.Type().Field(j) tagGorm := fieldModel.Tag.Get("gorm") tagGorm = getGormTag(tagGorm) fmt.Println("aaaa", tagGorm, tagJson) if tagGorm == tagJson { fmt.Println("match") value := m.FieldByName(fieldModel.Name) kind := v.FieldByName(fieldDest.Name).Kind() switch { case kind == reflect.Int64, kind == reflect.Int, kind == reflect.Int8, kind == reflect.Int16, kind == reflect.Int32: { fmt.Println("int") fi := v.FieldByName(fieldDest.Name) if !fi.CanSet() { return fmt.Errorf("can not set value of:%s", fieldDest.Name) } fmt.Println("set done", value.Int()) fi.SetInt(value.Int()) } case kind == reflect.String: { fi := v.FieldByName(fieldDest.Name) if !fi.CanSet() { return fmt.Errorf("can not set value of:%s", fieldDest.Name) } fi.SetString(value.String()) } case kind == reflect.Bool: { fi := v.FieldByName(fieldDest.Name) if !fi.CanSet() { return fmt.Errorf("can not set value of:%s", fieldDest.Name) } fi.SetBool(value.Bool()) } case kind == reflect.Float32, kind == reflect.Float64: { fi := v.FieldByName(fieldDest.Name) if !fi.CanSet() { return fmt.Errorf("can not set value of:%s", fieldDest.Name) } fi.SetFloat(value.Float()) } case kind == reflect.Struct: { //time.Time类型会被识别成struct,我要取到这个struct里面的时间值付给dest fmt.Println("time", kind) } default: return fmt.Errorf("暂不支持%s类型", kind) } } } } return nil } func getGormTag(gorm string) string { if len(gorm) < 7 { return "" } gorm = gorm[7:] res := strings.Split(gorm, ";") return res[0] } ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1470 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)