美文网首页来思Go
漫画Go语言stuct转map或其他结构体的各种方式及性能

漫画Go语言stuct转map或其他结构体的各种方式及性能

作者: 翱翔的赖思 | 来源:发表于2021-03-25 10:07 被阅读0次

    赖思与甜甜,有趣有料有温度,技术学习有思路!
    在Go语言开发中,想把stuct转map或其他结构体,有哪些方式及各个方式的性能表现如何? 让赖思来给我们详细的讲一下吧!


    0.jpg
    1.jpg
    package main
    
    import (
       "fmt"
    )
    
    type PersonEntity struct {
       id   string
       name string
       key  string
       addr string
    }
    
    type Student map[string]interface{}
    

    下面开始转换操作。第一种方式,也就是直接取值赋值:

    func main() {
       entity := PersonEntity{
          id:   "11111",
          name: "11111",
          key:  "11111",
          addr: "11111",
       }
       newMap := Student{
          "id":   entity.id,
          "name": entity.name,
          "key":  entity.key,
          "addr": entity.addr,
       }
       fmt.Printf("%#v", newMap)
    }
    
    2.png
    3.jpg
    4.jpg
    5.jpg

    话不多说,上代码:

    func convertJson() {
       entity := PersonEntity{
          id:   "11111",
          name: "11111",
          key:  "11111",
          addr: "11111",
       }
       j, _ := json.Marshal(entity)
       newMap := Student{}
       json.Unmarshal(j, &newMap)
       fmt.Printf("%#v", newMap)
    }
    

    运行一下:


    6.png
    7.jpg
    8.jpg
    type PersonEntity struct {
       Id   string
       Name string
       Key  string
       Addr string
    }
    
    func main() {
       entity := PersonEntity{
          Id:   "11111",
          Name: "11111",
          Key:  "11111",
          Addr: "11111",
       }
       j, _ := json.Marshal(entity)
       newMap := Student{}
       json.Unmarshal(j, &newMap)
       fmt.Printf("%#v", newMap)
    }
    

    把结构体中各变量首字母大写,这样再次运行结果如下:


    9.png

    第三种方式,直接通过反射实现。利用Go语言的反射机制,获取到原结构体中的内容,然后赋值给map。

    func main() {
       entity := PersonEntity{
          Id:   "11111",
          Name: "11111",
          Key:  "11111",
          Addr: "11111",
       }
       newMap := Student{}
       t := reflect.TypeOf(entity)
       v := reflect.ValueOf(entity)
       for i := 0; i < t.NumField(); i++ {
          newMap[t.Field(i).Name] = v.Field(i).Interface()
       }
       fmt.Printf("%#v", newMap)
    }
    
    10.png
    11.jpg
    type DTO struct {
       Id   string
       Name string
       Key  string
       Addr string
    }
    
    func main() {
       entity := PersonEntity{
          Id:   "11111",
          Name: "11111",
          Key:  "11111",
          Addr: "11111",
       }
       newStruct := DTO{}
       bVal := reflect.ValueOf(&newStruct).Elem()
       vVal := reflect.ValueOf(&entity).Elem()
       vTypeOfT := vVal.Type()
       for i := 0; i < vVal.NumField(); i++ {
          name := vTypeOfT.Field(i).Name
          if ok := bVal.FieldByName(name).IsValid(); ok {
             bVal.FieldByName(name).Set(reflect.ValueOf(vVal.Field(i).Interface()))
          }
       }
       fmt.Printf("%#v", newStruct)
    }
    
    12.jpg
    13.png
    • 直接赋值占用内存少且速度快,但是需要个性化定制,统一封装很麻烦;
    • json方式相对速度慢且占用内存多,但是代码简单易懂;
    • 而反射方式速度和内存占用都居中,但是操作复杂;


      14.jpg

    有趣有料有温度,和我一起学技术!
    欢迎大家交流学习,共同进步!

    相关文章

      网友评论

        本文标题:漫画Go语言stuct转map或其他结构体的各种方式及性能

        本文链接:https://www.haomeiwen.com/subject/btdlhltx.html