從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
}
