您现在的位置是:亿华云 > 域名
Go开发中结构体 model、dto 、time格式问题
亿华云2025-10-09 13:05:52【域名】8人已围观
简介1、背景model层不允许使用 json, dto层又重复造轮子,一个表的字段可能20个左右,那么赋值语句难受死了。其次就是json直接解析,model层的time.Time,完蛋格式不对,返回的数据
1、中结背景
model层不允许使用 json,构体格式 dto层又重复造轮子,问题一个表的中结字段可能20个左右,那么赋值语句难受死了。构体格式
其次就是问题json直接解析,model层的中结time.Time,完蛋格式不对,构体格式返回的问题数据不对。
比如
{ "user_name": "xiaoli",中结 "create_time": "2020-06-05T13:53:06.293614+08:00" }这种情况,无法解决,构体格式就需要必须重写一个dto。问题
那么如何解决这个问题呢,中结本人思考了一段时间,构体格式最终使用Map来解决。问题
2、b2b信息网解决问题
1、反射那么反射会遇到,各种奇葩的书写方式,有些人什么都出传入指针,有些人各种interface{ } 隐藏转换,反正就是太过于差异化。
所以就是需要解决,如何准确的拿到Value对象,下面是我写的一个工具类
func GetRealValue(value reflect.Value) reflect.Value { kind := value.Kind() if kind == reflect.Ptr { return GetRealValue(value.Elem()) } if kind == reflect.Interface { // eg:var s2 interface{ } // s2 = User{ } // fmt.Println(reflect.ValueOf(&s2).Elem().Kind())// interface // 所以这里需要将它转换 if value.CanInterface() { return GetRealValue(reflect.ValueOf(value.Interface())) } return GetRealValue(value.Elem()) } return value }解决这个问题,开干
2、下划线命名法下划线如何解决,结构体的字段属于驼峰命名法,免费信息发布网怎么解决呢?
写了一个简单的工具类
问题:
如果是ID,连续大写,输出i_d 因为数组到切片需要拷贝一次,所以可以利用unsafe解决,因为字符串底层就是切片,但是不安全 func CamelCase(s string) string { if s == "" { return "" } t := make([]byte, 0, 32) i := 0 for ; i < len(s); i++ { c := s[i] if isASCIIDigit(c) { t = append(t, c) continue } if isASCIIUpper(c) { c ^= } t = append(t, c) for i+1 < len(s) && isASCIIUpper(s[i+1]) { i++ t = append(t, _, s[i]+32) } } //return *(*string)(unsafe.Pointer(&t)) return string(t) } func isASCIIUpper(c byte) bool { return A <= c && c <= Z } func isASCIIDigit(c byte) bool { return 0 <= c && c <= 9 }3、开干
解决time的问题 反射、下划线命名法 func ToStdMap(bean interface{ }) map[string]interface{ } { _value := GetRealValue(reflect.ValueOf(bean)) if _value.Kind() != reflect.Struct { panic("the bean mush struct") } _type := _value.Type() fieldNum := _value.NumField() _map := make(map[string]interface{ }, fieldNum) for x := 0; x < fieldNum; x++ { field := _type.Field(x) value := GetRealValue(_value.Field(x)) if value.CanInterface() { realValue := value.Interface() switch realValue.(type) { case time.Time: _map[CamelCase(field.Name)] = times.FormatStdTime(realValue.(time.Time)) default: _map[CamelCase(field.Name)] = realValue } } } return _map }4、测试
func TestObjToMap(t *testing.T) { users := Users{ UserName: "xiaoli", } now := time.Now() users.CreateTime = &now stdMap := ToStdMap(users) bytes, err := json.Marshal(stdMap) if err != nil { t.Fatal(err) } fmt.Printf("%s\n", bytes) }输出结果:
完美,美中不足是需要使用likedMap,由于Golang源码包没有,所以,注定乱序
{ "create_time":"2020-06-05 14:05:31","user_name":"xiaoli"} 源码库很赞哦!(6)
相关文章
- a、变更前的公司证件扫描件(代码证或者营业执照)及联系人身份证复印件、变更后的公司证件扫描件(代码证或者营业执照)及新的联系人身份证复印件;身份证复印件需本人签名,公司证件复印件需加盖公章。
- React 架构的演变 - 更新机制
- 一个简单的跨域问题,一不小心就带来三个大大的 BUG
- 刚刚,给学妹普及了登录的两大绝学
- 评估域名涉及的行业规模与发展状况成正比。
- 漫画:为什么C语言永不过时?
- Linux 5.10内核更新带来更均衡的多路处理器SMT调度
- 什么是二叉搜索树,如何通过代码实现它们?
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
- 我对JS延迟异步脚本的思考