賴思與甜甜,有趣有料有溫度,技術(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)步!
