最近做Go开发的时候接触到了一个新的orm第三方框架gorose,在使用的过程中,发现没有类似beego进行直接对struct结构进行操作的方法,有部分API是通过map进行数据库相关操作,那么就需要我们把struct转化成map,下面是是我尝试两种不同struct转换成map的方法

mport (
"encoding/json"
"fmt"
"reflect"
"time"
) type Persion struct {
Id int
Name string
Address string
Email string
School string
City string
Company string
Age int
Sex string
Proviece string
Com string
PostTo string
Buys string
Hos string
} func main() {
StructToMapViaJson()
//StructToMapViaReflect()
} func StructToMapViaJson() {
m := make(map[string]interface{})
t := time.Now()
person := Persion{
Id: 98439,
Name: "zhaondifnei",
Address: "大沙地",
Email: "dashdisnin@126.com",
School: "广州第十五中学",
City: "zhongguoguanzhou",
Company: "sndifneinsifnienisn",
Age: 23,
Sex: "F",
Proviece: "jianxi",
Com: "广州兰博基尼",
PostTo: "蓝鲸XXXXXXXX",
Buys: "shensinfienisnfieni",
Hos: "zhonsndifneisnidnfie",
}
j, _ := json.Marshal(person)
json.Unmarshal(j, &m)
fmt.Println(m)
fmt.Println(time.Now().Sub(t))
}
一、通过struct转json,json转成map
func StructToMapViaJson() {
m := make(map[string]interface{})
t := time.Now()
person := Persion{
Id: 98439,
Name: "zhaondifnei",
Address: "大沙地",
Email: "dashdisnin@126.com",
School: "广州第十五中学",
City: "zhongguoguanzhou",
Company: "sndifneinsifnienisn",
Age: 23,
Sex: "F",
Proviece: "jianxi",
Com: "广州兰博基尼",
PostTo: "蓝鲸XXXXXXXX",
Buys: "shensinfienisnfieni",
Hos: "zhonsndifneisnidnfie",
}
j, _ := json.Marshal(person)
json.Unmarshal(j, &m)
fmt.Println(m)
fmt.Printf("duration:%d", time.Now().Sub(t))
}
output:
map[Proviece:jianxi Com:广州兰博基尼 Hos:zhonsndifneisnidnfie Name:zhaondifnei Company:sndifneinsifnienisn Buys:shensinfienisnfieni Age:23 PostTo:蓝鲸XXXXXXXX Address:大沙地 School:广州第十五中学 City:zhongguoguanzhou Sex:F Id:98439 Email:dashdisnin@126.com]
duration:250467

  

二、通过反射形式生成map
func StructToMapViaReflect() {
m := make(map[string]interface{})
t := time.Now()
person := Persion{
Id: 98439,
Name: "zhaondifnei",
Address: "大沙地",
Email: "dashdisnin@126.com",
School: "广州第十五中学",
City: "zhongguoguanzhou",
Company: "sndifneinsifnienisn",
Age: 23,
Sex: "F",
Proviece: "jianxi",
Com: "广州兰博基尼",
PostTo: "蓝鲸XXXXXXXX",
Buys: "shensinfienisnfieni",
Hos: "zhonsndifneisnidnfie",
}
elem := reflect.ValueOf(&person).Elem()
relType := elem.Type()
for i := 0; i < relType.NumField(); i++ {
m[relType.Field(i).Name] = elem.Field(i).Interface()
}
fmt.Println(m)
fmt.Printf("duration:%d", time.Now().Sub(t))
}
output:
map[Buys:shensinfienisnfieni Name:zhaondifnei City:zhongguoguanzhou Sex:F Proviece:jianxi Com:广州兰博基尼 Id:98439 School:广州第十五中学 Address:大沙地 Age:23 PostTo:蓝鲸XXXXXXXX Hos:zhonsndifneisnidnfie Email:dashdisnin@126.com Company:sndifneinsifnienisn]
duration:104239

  结论

通过比较可以看出,通过反射的形式转换基本上是通过json形式转换的两倍。

Go开发Struct转换成map两种方式比较的更多相关文章

  1. golang 开发 Struct 转换成 map 两种方式比较

    原文链接:https://www.jianshu.com/p/81c4304f6d1b 最近做Go开发的时候接触到了一个新的orm第三方框架gorose,在使用的过程中,发现没有类似beego进行直接 ...

  2. Android中手机录屏并转换GIF的两种方式

    之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...

  3. c# 将csv文件转换datatable的两种方式。

    第一种: public static DataTable csvdatatable(string path) { DataTable dt = new DataTable(); string conn ...

  4. ABAP和XML数据格式互相转换的两种方式

    ABAP和XML数据格式互相转换是广大开发人员经常遇到的需求.本文介绍两种方式. 1. ABAP提供了一个工具类cl_proxy_xml_transform,通过它的两个方法abap_to_xml_x ...

  5. 将html页改成jsp的两种方式

    将html页改成jsp的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-08-13 将html页改成jsp有两种方法,第一种是直接修改html文件,另一种是新建jsp文件.下面为大 ...

  6. C#技术分享【PDF转换成图片——13种方案】(2013-07-25重新整理)

    原文:C#技术分享[PDF转换成图片--13种方案](2013-07-25重新整理) 重要说明:本博已迁移到 石佳劼的博客,有疑问请到 文章新地址 留言!!! 写在最前面:为了节约大家时间,撸主把最常 ...

  7. 【转】java中byte数组与int类型的转换(两种方式)----不错

    原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...

  8. spring boot @ResponseBody转换JSON 时 Date 类型处理方法,Jackson和FastJson两种方式,springboot 2.0.9配置fastjson不生效官方解决办法

    spring boot @ResponseBody转换JSON 时 Date 类型处理方法 ,这里一共有两种不同解析方式(Jackson和FastJson两种方式,springboot我用的1.x的版 ...

  9. 利用阿里巴巴封装的FastJSON来解析json并转换成map

    利用阿里巴巴封装的FastJSON来解析json并转换成map   package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; i ...

随机推荐

  1. PAT 甲级真题

    1019. General Palindromic Number 题意:求数N在b进制下其序列是否为回文串,并输出其在b进制下的表示. 思路:模拟N在2进制下的表示求法,“除b倒取余”,之后判断是否回 ...

  2. js, 树状菜单隐藏显示

    js写的不是很严谨~~~嘿嘿   <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  3. 错误:未启用当前数据库的SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker。

    解决方法: 打开SQL Server,新建查询: ALTER DATABASE 数据库名 SET NEW_BROKER WITH ROLLBACK IMMEDIATE;ALTER DATABASE 数 ...

  4. Node单线程与异步编程的初步理解

    最近学习了一些关于node的单线程与异步的知识,想拿过来和大家分享下: var async = require('async') //并行无关联,等待事件为最长时间请求过程.如以下两个任务执行时间 c ...

  5. 优秀 H5 案例收集 Vol.2(不定期更新)

    上期浏览:Vol.1 再见了,影史最性感的硬汉http://news.163.com/special/fdh5_wolverine/ 活出真我http://balfhcy.pernod-ricard- ...

  6. Refseq,accssion #,gi ,Ensembl的关系

    accession编号的分子类型代号: Ensembl是2000年就开始开发的基因组自动注释软件,起初是只对真核生物基因组,2009年后开始对植物,细菌等开放.既然要注释,就要有注释对象(基因,转录本 ...

  7. Mahout 分类算法

    实验简介 本次课程学习了Mahout 的 Bayes 分类算法. 一.实验环境说明 1. 环境登录 无需密码自动登录,系统用户名 shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu ...

  8. C语言中 ln(以自然对数e为底) lg(以十为底) 以及logab(以a为底,b为真数)的相关知识

    总所周知,我们在高中学过对数函数,记作y=logax.下面是百度百科关于对数函数的描述: 对数的定义:一般地,如果ax=N(a>0,且a≠1),那么数x叫做以a为底N的对数,记作x=logaN, ...

  9. Oracle 伪列

    ROWNUM ROWNUM:表示行号,实际上此是一个列,但是这个列是一个伪列,此列可以在每张表中出现. 范例:在查询雇员表上,加入 ROWNUM SELECT ROWNUM,empno,ename,j ...

  10. 《React-Native系列》RN与native交互与数据传递

    RN怎么与native交互的呢? 下面我们通过一个简单的Demo来实现:RN页面调起Native页面,Native页面选择电话本数据,将数据回传给RN展示. 首先是 Native侧 1.MainAct ...