怎样把一个结构体转换成相应的map结构?

type Body struct {
    Person1 string
    Age     int
    Salary  float32
}

A=Body{"aaa", 2,12.34}

现在想转成 B[Person1]="aaa"; B[Age]=2, B[Salary]=12.34

如果字段很多,有没有什么好的方法,自动实现?

共 12 个回复


goner

主要是大家不明白你到底是什么意思?是下面的这个意思么?

m:=make(map[string]Body)
B := Body{}

for _,v  :=range A {
...
...
m[x] = B
}

?有必要做这个转换么?不明白

# 0

jimmykuu

当然不是楼上的意思,他写的很明白。

# 1

jimmykuu

package main

import (
    "fmt"
    "reflect"
)

type Body struct {
    Person1 string
    Age     int
    Salary  float32
}

func main() {
    a := Body{"aaa", 2, 12.34}
    elem := reflect.ValueOf(&a).Elem()
    type_ := elem.Type()

    map_ := map[string]interface{}{}

    for i := 0; i < type_.NumField(); i++ {
        map_[type_.Field(i).Name] = elem.Field(i).Interface()

    }

    fmt.Println(map_)
}
# 2

goner

这样的要求是否可以 struct 》 json 》 map ?这样简单的命令就可以完成吧?

# 4

helloworld

弱弱的问下 楼上type还有map 这两个下划线是干啥的

# 5

joeonly

“这样的要求是否可以 struct 》 json 》 map ?这样简单的命令就可以完成吧?”
正解。

# 6

joeonly

“这样的要求是否可以 struct 》 json 》 map ?这样简单的命令就可以完成吧?”
正解。

# 7

samuier

func Struct2Map(obj interface{}) (data map[string]interface{}, err error) {
    data = make(map[string]interface{})
    objT := reflect.TypeOf(obj)
    objV := reflect.ValueOf(obj)
    for i := 0; i < objT.NumField(); i++ {
        data[objT.Field(i).Name] = objV.Field(i).Interface()
    }
    err = nil
    return
}
# 8

golwei

package main

import (
    "encoding/json"
    "fmt"
    "time"
)

type Persion struct {
    Id   int
    Name string
}

func main() {
    t := time.Now()
    persion := Persion{100, "lee"}
    j, _ := json.Marshal(persion)
    fmt.Println(string(j))
    fmt.Println(time.Now().Sub(t))
}
# 10

golwei

package main

import (
    "encoding/json"
    "fmt"
    "time"
)

type Persion struct {
    Id   int
    Name string
}

func main() {
    //    var m map[string]interface{}
    m := make(map[string]interface{})
    t := time.Now()
    persion := Persion{100, "lee"}
    j, _ := json.Marshal(persion)
    json.Unmarshal(j, &m)
    fmt.Println(m)
    fmt.Println(time.Now().Sub(t))
}
# 11