【每天一个Go知识点】(7) go:map转结构体
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【每天一个Go知识点】(7) go:map转结构体相关的知识,希望对你有一定的参考价值。
参考技术A 可以通过github.com/mitchellh/mapstructure包的mapstructure.Decode(map[string]interface,*struct)方法将map转换成结构体,该方法的参数有两个,第一个参数是要转换的map变量,
第二个参数是struct结构体变量指针,
下面通过一个例子说明mapstructure.Decode()函数的使用方法,如:
运行结果
运行结果:
go 实现struct转map
从python转golang大约一个月了,对struct的使用还算顺手,但是很多时候还是会想念python的便捷。比如同时遍历两个字典,python使用for (x, y) in zip(map1, map2)就可以了,但是golang同时操作两个结构体就显得繁重。所以我要实现一个简单的需求,struct转map。
转换的方法也很简单,我们利用反射reflect来解剖struct的字段,从而构建出字典。
博主今天身体不适,打不动字了,直接上代码吧
import ( "reflect" ) func Struct2Map(obj interface{}) map[string]interface{} { t := reflect.TypeOf(obj) v := reflect.ValueOf(obj) var data = make(map[string]interface{}) for i := 0; i < t.NumField(); i++ { data[t.Field(i).Name] = v.Field(i).Interface() } return data }
传入的obj是struct,而不是struct指针,假设结构体叫做Test,那么obj的声名方式为var obj Test或者obj := Test{}
如果一定要声明称指针( obj := new(Test)或obj := &Test{} )时,Struct2Map方法中需要将取出指针的内容然后继续操作,因为指针是没有Field()方法的。代码如下
import ( "reflect" ) func Struct2Map(obj interface{}) map[string]interface{} { obj_v := reflect.ValueOf(obj) v := obj_v.Elem() typeOfType := v.Type() var data = make(map[string]interface{}) for i := 0; i < v.NumField(); i++ { field := v.Field(i) data[typeOfType.Field(i).Name] = field.Interface() } return data }
以上是关于【每天一个Go知识点】(7) go:map转结构体的主要内容,如果未能解决你的问题,请参考以下文章