1. 程式人生 > >go 實現struct轉map

go 實現struct轉map

繼續 PE 結構體 {} 聲明 ++ 方式 UC make

從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 實現struct轉map