【每天一个Go知识点】(7) go:map转结构体

2021-09-30  本文已影响0人  HAO延WEI

方式一、通过mapstructure.Decode()方法

可以通过github.com/mitchellh/mapstructure包的mapstructure.Decode(map[string]interface,*struct)方法将map转换成结构体,该方法的参数有两个,
第一个参数是要转换的map变量,
第二个参数是struct结构体变量指针,
下面通过一个例子说明mapstructure.Decode()函数的使用方法,如:

"""
注意的点:
1、map[string]interface的键值将对应字段赋值到结构体时忽略大小写;
2、结构体中所有字段名必须以大写字母开头,否则将无法赋值
3、使用mapstructure.Decode()方法不能转化携带_特殊符号的变量
"""
package main

import (
    "fmt"
    "github.com/mitchellh/mapstructure"
)
type student struct{
    id int `json:"id"`
    Name string `json:"name"`
    Adress []string `json:"adress"`
}
func main() {
    val := map[string]interface{}{
        "id":1,
        "name":"xiaoming",
        "adress":[]string{"beijing","nanjing"},
    }
    stu := student{}
    err := mapstructure.Decode(val,&stu)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println("val:")
    fmt.Println(val)
    fmt.Println("struct:")
    fmt.Println(stu)
}

运行结果

val:
map[adress:[beijing nanjing] id:1 name:xiaoming]
struct:
{1 xiaoming [beijing nanjing]}

方式二、通过json序列化和反序列化实现map到struct的转换

package main

import (
    "encoding/json"
    "fmt"
)
type student struct{
    id int `json:"id"`
    Name string `json:"name"`
    Adress []string `json:"adress"`
    PhoneNumber string `json:"phone_number"`
}
func main() {
    val := map[string]interface{}{
        "id":1,
        "name":"xiaoming",
        "adress":[]string{"beijing","nanjing"},
        "phone_number":"12345678",
    }
    stu := student{}
    arr,err := json.Marshal(val)
    if err != nil {
        fmt.Println(err)
        return
    }
    err = json.Unmarshal(arr,&stu)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("val:")
    fmt.Println(val)
    fmt.Println("struct:")
    fmt.Println(stu)
}

运行结果:

val:
map[adress:[beijing nanjing] id:1 name:xiaoming phone_number:12345678]
struct:
{0 xiaoming [beijing nanjing] 12345678}
上一篇 下一篇

猜你喜欢

热点阅读