搜索
简帛阁>技术文章>go语言map转结构体

go语言map转结构体

方式一、通过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,并且实现了下划线命名字段到驼峰式命名字段之间的赋值

式一、通过mapstructureDecode()方法可以通过githubcom/mitchellh/mapstructure包的mapstructureDecode(map[string]inte
Go语言结构跟C语言结构有点类似,不过定义方法有点区别。结构定义:typepersonstruct{namestringageint8}结构初始化:p0:person{Hi,18}p1:p
文章目录一、Go语言结构二、结构的实例化三、初始化结构成员方法四、模拟构造函数五、Go语言方法和接收器51基础概念52为结构添加方法六、为任意类型添加方法七、Go语言使用事件系统实现事件的响
结构go语言中的结构,是一种复合类型,有一组属性构成,这些属性被称为字段。结构也是值类型,可以使用new来创建。定义:typenamestruct{field1type1field2type2}
目录前言什么是空结构特点地址相同大小为0原理探究使用场景集合(Set)channel中信号传输总结前言在使用Go语言开发过程中,我们不免会定义结构,但是我们定义的结构都是有字段的,基本不会定义不
Golang官方称Go语言的语法相对Java语言而言要简洁很多,但是简洁背后也灵活了很多,所以很多看似很简单的代码上的细节稍不注意就会产生坑。本文主要对struct结构的相关的语法进行总结和说明。结
Go语言结构开始学习Go编程语言的基础构建模块前,先来了解Go语言最简单程序的结构。GoHelloWorld实例Go语言的基础组成有以下几个部分:包声明引入包函数变量语句表达式注释接下来让我们来看下简
结构类型type名字struct{},下面这段是githubcom/urfave/cli包里的代码,声明了一个App的结构类型typeAppstruct{//Thenameoftheprogra
map一般是以库的方式提供,在C++和C和JAVA中都需要引用相应的库而Go语言不需要引入库,可以直接方便使用定义:map是一堆键值对的未排序集合。无序1声明变量:map的声明基本上没有多余的元素:
1遍历顺序Go语言里的map,是不保证遍历顺序的(这一点很好理解)。甚至同样内容的map,两次遍历的顺序,也可能不一样。下面是一个例子:m:map[string]int{a1:1,b2:10,c3:2