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