This is a creation in Article, where the information may have evolved or changed.
Http://stackoverflow.com/questions/26744873/converting-map-to-struct
Func SetField (objInterface{}, Namestring, valueInterface{}) error {structvalue:=reflect. ValueOf (obj). Elem () Structfieldvalue:=structvalue.fieldbyname (name)if!Structfieldvalue.isvalid () {returnFmt. Errorf ("No Such field:%s in obj", Name)} if!Structfieldvalue.canset () {returnFmt. Errorf ("Cannot set%s field value", Name)} Structfieldtype:=Structfieldvalue.type () Val:=reflect. ValueOf (value)ifStructfieldtype! =val. Type () {returnErrors. New ("provided value type didn ' t match obj field type")} structfieldvalue.set (val)returnNil}type mystructstruct{NamestringAge Int64}func (s*mystruct) fillstruct (M map[string]Interface{}) error { forK, V: =range M {err:=SetField (S, K, V)ifErr! =Nil {returnErr}} returnNil}func Main () {myData:= Make (map[string]Interface{}) mydata["Name"] ="Tony"mydata[" Age"] = Int64 ( at) Result:= &mystruct{} ERR:=result. Fillstruct (MyData)ifErr! =Nil {fmt. PRINTLN (Err)} FMT. PRINTLN (Result)}
From the results of MySQL to a struct
Type operconfstruct{Id uint32 ' sql:"oper_id"' Namestring' sql:"Oper_name"' msgretytimes uint32 ' sql:"Msg_retry_times"' Msgretyinterval uint32 ' sql:"Msg_retry_interval"' Heartbeartinterval uint32 ' sql:"Heartbeat_interval"' offlinedetecttime uint32 ' sql:"Offline_detect_time"'}func getoperconf ([]operconf, error) {host:=getconf (). Mysql.host Port:=getconf (). Mysql.port User:=getconf (). Mysql.user Password:=getconf (). Mysql.pwd DbName:=getconf (). Mysql.db table:=getconf (). Mysql.table sql:=New(MySQL) defer SQL. Close ()ifERR: = SQL. Connect (host, port, user, password, dbName, table); Err! =Nil {logger. DEBUG (Log_name,"SLQ. Connect err:%s", Err. Error ())returnnil, err} SQLSTR:="SELECT oper_id, Oper_name, Msg_retry_times, Msg_retry_interval, Heartbeat_interval, Offline_detect_time"sqlstr+=" from"+table result, err:=SQL. Query (SQLSTR)ifErr! =Nil {returnnil, err} Confarr:=Make ([]operconf, Len (result)) forI, V: =Range Result {oc:=New(operconf) datatostruct (V, OC) logger. DEBUG (Log_name,"Oc:%+v", OC) confarr[i]= *OC}returnNil, nil}type MySQLstruct{m_db*SQL. Db}func ( This*mysql) Connect (hoststring, Portint, user, password, dbName, tablestring) Error {DSN:= Fmt. Sprintf ("%s:%s@tcp (%s:%d)/%s?charset=utf8", user, password, host, port, DbName)varErr Error This. m_db, err = sql. Open ("MySQL", DSN)ifErr! =Nil {fmt. Println ("Error:%s\n", Err. Error ())returnErr} Err= This. m_db. Ping ()ifErr! =Nil { This. m_db. Close ()}returnErr}func ( This*MySQL) Close () { This. m_db. Close ()}func ( This*MYSQL) Query (sqlstring) (map[int]map[string]string, error) { if This. m_db = =Nil {returnNil, errors. New ("MySQL not connect") } varquery =strings. Trimspace (SQL) s, err:= RegExp. Matchstring (' (? i) ^Select', query)//(? i) igonre upper/lower case ifErr! =Nil {returnnil, err}ifs = =false { returnNil, errors. New ("Not Select SQL")} rows, _:= This. m_db. Query (SQL) C, err:= This. Getqueryresult (rows)returnC, Err}func ( This*mysql) Getqueryresult (rows *sql. Rows) (map[int]map[string]string, error) { varresult = Make (map[int]map[string]string) Columns, _:=rows. Columns () Values:=Make ([]sql. Rawbytes, Len (columns)) Scanargs:= Make ([]Interface{}, Len (values)) forI: =range Values {Scanargs[i]= &Values[i]}varn =0 forrows. Next () {Result[n]= Make (map[string]string) Err:=rows. Scan (Scanargs ...) ifErr! =Nil {returnnil, err} forI, V: =range Values {Result[n][columns[i]]=string(v)} n++} logger. DEBUG (Log_name,"Query result:%+v", result)returnresult, Nil}func datatostruct (data map[string]string, out Interface{}) {ss:= Reflect. ValueOf ( out). Elem () forI: =0; I < SS. Numfield (); i++{val:= Data[ss. Type (). Field (i). Tag.get ("SQL")] Name:=SS. Type (). Field (i). Name logger. DEBUG (Log_name,"tag:%s, Tag value:%s, filed name:%s"Ss. Type (). Field (i). Tag.get ("SQL"), Val, name)SwitchSS. Field (i). Kind () { Casereflect. String:ss. Fieldbyname (name). SetString (val) Casereflect. Int, reflect. Int16, reflect. Int32, reflect. INT64:I, err:=StrConv. Atoi (val)//FMT. Println ("I:", I, name) ifErr! =Nil {logger. ERROR (Log_name,"can ' t not atoi:%v", Val)Continue} SS. Fieldbyname (name). Setint (Int64 (i)) Casereflect. Uint16, reflect. Uint32, reflect. UINT64:I, err:=StrConv. Atoi (val)//FMT. Println ("I:", I, name) ifErr! =Nil {logger. ERROR (Log_name,"can ' t not atoi:%v", Val)Continue} SS. Fieldbyname (name). Setuint (UInt64 (i)) Casereflect. Float32, reflect. Float64:f, err:= StrConv. Parsefloat (Val, -) ifErr! =Nil {logger. ERROR (Log_name,"can ' t not parsefloat:%v", Val)Continue} SS. Fieldbyname (name). SetFloat (f)default: Logger. ERROR (Log_name,"Unknown Type:%+v", SS. Field (i). Kind ())}}return}