详解Go开发Struct转换成map两种方式比较

最近做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形式转换的两倍。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • golang struct扩展函数参数命名警告解决方法

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.com/zsy619/gcommon" ) //ChunkFooter 块Footer type ChunkFooter struct { ChunkDataTotalSize int } //NewChunkFooter 创建一个ChunkFooter func NewChunkFooter(chu

  • 详解Angular之constructor和ngOnInit差异及适用场景

    Angular中根据适用场景定义了很多生命周期函数,其本质上是事件的响应函数,其中最常用的就是ngOnInit.但在TypeScript或ES6中还存在着名为constructor的构造函数,开发过程中经常会混淆二者,毕竟它们的含义有某些重复部分,那ngOnInit和constructor之间有什么区别呢?它们各自的适用场景又是什么呢? 区别 constructor是ES6引入类的概念后新出现的东东,是类的自身属性,并不属于Angular的范畴,所以Angular没有办法控制constructo

  • Golang学习笔记(六):struct

    struct struct,一组字段的集合,类似其他语言的class 放弃了大量包括继承在内的面向对象特性,只保留了组合(composition)这个最基础的特性 1.声明及初始化 复制代码 代码如下: type person struct {     name string     age  int } //初始化 func main() {     var P person P.name = "tom"     P.age = 25     fmt.Println(P.name)

  • 详解Angular 中 ngOnInit 和 constructor 使用场景

    1. constructor constructor应该是ES6中明确使用constructor来表示构造函数的,构造函数使用在class中,用来做初始化操作.当包含constructor的类被实例化时,构造函数将被调用. 来看例子: class AppComponent { public name: string; constructor(name) { console.log('Constructor initialization'); this.name = name; } } let a

  • golang中struct和interface的基础使用教程

    前言 本文主要给大家介绍了关于golang中struct和interface的相关内容,是属于golang的基本知识,下面话不多说了,来一起看看详细的介绍吧. struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套:go中的struct类型理解为类,可以定义方法,和函数定义有些许区别:struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User

  • 浅谈Go语言中的结构体struct & 接口Interface & 反射

    结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struct类型理解为类,可以定义方法,和函数定义有些许区别: struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var user2 *User = new(User) struct使用 下面示例中user1和

  • 解析Go语言编程中的struct结构

    struct和C语言的很相似,模拟出class的功能,但是不完全的!没有构造函数等! struct的申明 复制代码 代码如下: package main import "fmt" type Person struct {  Age  int  Name string } func main() {  //初始化两种  a := Person{}  a.Age = 2  a.Name = "widuu"  fmt.Println(a)  b := Person{   

  • Go语言struct类型详解

    struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样的类型我们称之struct.如下代码所示: 复制代码 代码如下: type person struct {     name string     age int } 看到了吗?声明一个struct如此简单,上面的类型包含有两个字段. 1.一个string类型的字段name,用来保存用户名称这个属性

  • Go语言struct类型介绍

    struct 我们可以声明新的类型,作为其它类型的属性或字段容器. 如,创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名&年龄.这样的类型我们称之为struct. 复制代码 代码如下: type person struct{         name string         age int } 复制代码 代码如下: var P person // P 现在就是 person 类型的变量了 P.name = "Astaxie" //  赋值 "

  • golang struct 实现 interface的方法

    golang中,一般strcut包含 interface类型后,struct类型都需要实现 interface导出的接口,从而成为相应的 interface接口类. 实际上,struct包含interface之后,并不需要实现interface的接口,也能成为 interface接口类. 代码如下: type newEr interface { New() } type testInterface interface { newEr Done() <-chan struct{} } type k

  • Go语言中struct的匿名属性特征实例分析

    本文实例分析了Go语言中struct的匿名属性特征.分享给大家供大家参考.具体分析如下: Go语言中struct的属性可以没有名字而只有类型,使用时类型即为属性名.(因此,一个struct中同一个类型的匿名属性只能有一个) 复制代码 代码如下: type PersonC struct {      id      int      country string  }    //匿名属性  type Worker struct {      //如果Worker有属性id,则worker.id表示

随机推荐