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

可以通过github.com/mitchellh/mapstructure包的mapstructure.Decode(map[string]interface,*struct)方法将map转换成结构体,该方法的参数有两个,第一个参数是要转换的map变量,第二个参数是struct结构体变量指针,下面通过一个例子说明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]}

注意的点:1、map[string]interface的键值将对应字段赋值到结构体时忽略大小写;2、结构体中所有字段名必须以大写字母开头,否则将无法赋值

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

可以通过序列化和反序列化操作将map转换为struct, 主要是解决map键值下划线命名和struct字段的驼峰式命名的匹配,下面用一个例子说明,如:

package main

import (
	"fmt"
	"github.com/mitchellh/mapstructure"
)
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{}
	//使用mapstructure.Decode()方法
	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[id:1 ipadress:[beijing nanjing] name:xiaoming phone_number:12345678]
struct:
{0 xiaoming [beijing nanjing] }

可以看到,使用mapstructure.Decode()方法没有将phone_number赋值到struct结构体变量的PhoneNumber字段,在有些场景下需要将带有下划线的map转换成struct时,就可以利用序列化和反序列化的方法进行转换,这里主要是通过利用struct字段和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}

可以看到,map已经成功转换成struct,并且实现了下划线命名字段到驼峰式命名字段之间的赋值


版权声明:本文为m0_67403272原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_67403272/article/details/123623343