go 實現struct轉map

從python轉golang大約一個月了,對struct的使用還算順手,可是不少時候仍是會想念python的便捷。好比同時遍歷兩個字典,python使用for (x, y) in zip(map1, map2)就能夠了,可是golang同時操做兩個結構體就顯得繁重。因此我要實現一個簡單的需求,struct轉map。python

轉換的方法也很簡單,咱們利用反射reflect來解剖struct的字段,從而構建出字典。golang

博主今天身體不適,打不動字了,直接上代碼吧spa

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()方法的。代碼以下blog

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
}
相關文章
相關標籤/搜索