go 實現struct轉map
阿新 • • 發佈:2018-05-06
繼續 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