詳解Go開發(fā)Struct轉(zhuǎn)換成map兩種方式比較
最近做Go開發(fā)的時候接觸到了一個新的orm第三方框架gorose,在使用的過程中,發(fā)現(xiàn)沒有類似beego進行直接對struct結(jié)構(gòu)進行操作的方法,有部分API是通過map進行數(shù)據(jù)庫相關(guān)操作,那么就需要我們把struct轉(zhuǎn)化成map,下面是是我嘗試兩種不同struct轉(zhuǎn)換成map的方法
mport ( "encoding/json" "fmt" "reflect" "time" ) type Persion struct { Id int Name string Address string Email string School string City string Company string Age int Sex string Proviece string Com string PostTo string Buys string Hos string } func main() { StructToMapViaJson() //StructToMapViaReflect() } func StructToMapViaJson() { m := make(map[string]interface{}) t := time.Now() person := Persion{ Id: 98439, Name: "zhaondifnei", Address: "大沙地", Email: "dashdisnin@126.com", School: "廣州第十五中學(xué)", City: "zhongguoguanzhou", Company: "sndifneinsifnienisn", Age: 23, Sex: "F", Proviece: "jianxi", Com: "廣州蘭博基尼", PostTo: "藍鯨XXXXXXXX", Buys: "shensinfienisnfieni", Hos: "zhonsndifneisnidnfie", } j, _ := json.Marshal(person) json.Unmarshal(j, &m) fmt.Println(m) fmt.Println(time.Now().Sub(t)) }
一、通過struct轉(zhuǎn)json,json轉(zhuǎn)成map
func StructToMapViaJson() { m := make(map[string]interface{}) t := time.Now() person := Persion{ Id: 98439, Name: "zhaondifnei", Address: "大沙地", Email: "dashdisnin@126.com", School: "廣州第十五中學(xué)", City: "zhongguoguanzhou", Company: "sndifneinsifnienisn", Age: 23, Sex: "F", Proviece: "jianxi", Com: "廣州蘭博基尼", PostTo: "藍鯨XXXXXXXX", Buys: "shensinfienisnfieni", Hos: "zhonsndifneisnidnfie", } j, _ := json.Marshal(person) json.Unmarshal(j, &m) fmt.Println(m) fmt.Printf("duration:%d", time.Now().Sub(t)) }
output:
map[Proviece:jianxi Com:廣州蘭博基尼 Hos:zhonsndifneisnidnfie Name:zhaondifnei Company:sndifneinsifnienisn Buys:shensinfienisnfieni Age:23 PostTo:藍鯨XXXXXXXX Address:大沙地 School:廣州第十五中學(xué) City:zhongguoguanzhou Sex:F Id:98439 Email:dashdisnin@126.com]
duration:250467
二、通過反射形式生成map
func StructToMapViaReflect() { m := make(map[string]interface{}) t := time.Now() person := Persion{ Id: 98439, Name: "zhaondifnei", Address: "大沙地", Email: "dashdisnin@126.com", School: "廣州第十五中學(xué)", City: "zhongguoguanzhou", Company: "sndifneinsifnienisn", Age: 23, Sex: "F", Proviece: "jianxi", Com: "廣州蘭博基尼", PostTo: "藍鯨XXXXXXXX", Buys: "shensinfienisnfieni", Hos: "zhonsndifneisnidnfie", } elem := reflect.ValueOf(&person).Elem() relType := elem.Type() for i := 0; i < relType.NumField(); i++ { m[relType.Field(i).Name] = elem.Field(i).Interface() } fmt.Println(m) fmt.Printf("duration:%d", time.Now().Sub(t)) }
output:
map[Buys:shensinfienisnfieni Name:zhaondifnei City:zhongguoguanzhou Sex:F Proviece:jianxi Com:廣州蘭博基尼 Id:98439 School:廣州第十五中學(xué) Address:大沙地 Age:23 PostTo:藍鯨XXXXXXXX Hos:zhonsndifneisnidnfie Email:dashdisnin@126.com Company:sndifneinsifnienisn]
duration:104239
結(jié)論
通過比較可以看出,通過反射的形式轉(zhuǎn)換基本上是通過json形式轉(zhuǎn)換的兩倍。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- golang struct 實現(xiàn) interface的方法
- golang中struct和interface的基礎(chǔ)使用教程
- 淺談Go語言中的結(jié)構(gòu)體struct & 接口Interface & 反射
- 詳解Angular之constructor和ngOnInit差異及適用場景
- 詳解Angular 中 ngOnInit 和 constructor 使用場景
- golang struct擴展函數(shù)參數(shù)命名警告解決方法
- 解析Go語言編程中的struct結(jié)構(gòu)
- Golang學(xué)習(xí)筆記(六):struct
- Go語言中struct的匿名屬性特征實例分析
- Go語言struct類型介紹
- Go語言struct類型詳解
相關(guān)文章
GoLang調(diào)用鏈可視化go-callvis使用介紹
與鏈路追蹤(Tracing)不同,Tracing關(guān)注復(fù)雜的分布式環(huán)境中各個服務(wù)節(jié)點間的調(diào)用關(guān)系,主要用于服務(wù)治理。而我們本次探索的代碼調(diào)用鏈路則是代碼方法級別的調(diào)用關(guān)系,主要用于代碼設(shè)計2023-02-02Go構(gòu)建器模式構(gòu)建復(fù)雜對象方法實例
本文介紹了構(gòu)建器模式,如何通過構(gòu)建器對象構(gòu)建復(fù)雜業(yè)務(wù)對象的方法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Go語言LeetCode題解961在長度2N的數(shù)組中找出重復(fù)N次元素
這篇文章主要為大家介紹了Go語言LeetCode題解961在長度2N的數(shù)組中找出重復(fù)N次元素示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12Go?iota關(guān)鍵字與枚舉類型實現(xiàn)原理
這篇文章主要介紹了Go?iota關(guān)鍵字與枚舉類型實現(xiàn)原理,iota是go語言的常量計數(shù)器,只能在常量的表達式中使用,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-07-07