赖思与甜甜,有趣有料有温度,技术学习有思路!
在Go语言开发中,想把stuct转map或其他结构体,有哪些方式及各个方式的性能表现如何? 让赖思来给我们详细的讲一下吧!
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)
}
话不多说,上代码:
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)
}
运行一下:
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)
}
把结构体中各变量首字母大写,这样再次运行结果如下:
第三种方式,直接通过反射实现。利用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)
}
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)
}
-
直接赋值占用内存少且速度快,但是需要个性化定制,没办法统一封装;
-
json方式相对速度慢且占用内存多,但是代码简单易懂;
-
而反射方式速度和内存占用都居中,但是操作复杂;
有趣有料有温度,和我一起学技术!
欢迎关注公众号 来思Go,收看更多赖思与甜甜的技术学习日常。