漫畫Go語言stuct轉(zhuǎn)map或其他結(jié)構(gòu)體的各種方式及性能

賴思與甜甜,有趣有料有溫度,技術(shù)學(xué)習(xí)有思路!
在Go語言開發(fā)中,想把stuct轉(zhuǎn)map或其他結(jié)構(gòu)體,有哪些方式及各個方式的性能表現(xiàn)如何? 讓賴思來給我們詳細(xì)的講一下吧!


0.jpg

1.jpg
package main

import (
   "fmt"
)

type PersonEntity struct {
   id   string
   name string
   key  string
   addr string
}

type Student map[string]interface{}

下面開始轉(zhuǎn)換操作。第一種方式,也就是直接取值賦值:

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)
}

運(yùn)行一下:


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)
}

把結(jié)構(gòu)體中各變量首字母大寫,這樣再次運(yùn)行結(jié)果如下:


9.png

第三種方式,直接通過反射實(shí)現(xiàn)。利用Go語言的反射機(jī)制,獲取到原結(jié)構(gòu)體中的內(nèi)容,然后賦值給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
  • 直接賦值占用內(nèi)存少且速度快,但是需要個性化定制,統(tǒng)一封裝很麻煩;
  • json方式相對速度慢且占用內(nèi)存多,但是代碼簡單易懂;
  • 而反射方式速度和內(nèi)存占用都居中,但是操作復(fù)雜;


    14.jpg

有趣有料有溫度,和我一起學(xué)技術(shù)!
歡迎大家交流學(xué)習(xí),共同進(jìn)步!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容