zoukankan      html  css  js  c++  java
  • 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形式转换的两倍。



  • 相关阅读:
    【转】win8.1下安装ubuntu
    Codeforces 1025G Company Acquisitions (概率期望)
    Codeforces 997D Cycles in Product (点分治、DP计数)
    Codeforces 997E Good Subsegments (线段树)
    Codeforces 1188E Problem from Red Panda (计数)
    Codeforces 1284E New Year and Castle Building (计算几何)
    Codeforces 1322D Reality Show (DP)
    AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
    Codeforces 1305F Kuroni and the Punishment (随机化)
    AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
  • 原文地址:https://www.cnblogs.com/dfsxh/p/10315442.html
Copyright © 2011-2022 走看看