电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

golang struct, map, json之間的相互轉(zhuǎn)換

瀏覽:96日期:2024-05-29 11:29:18
目錄公共代碼區(qū)域一、map, struct 互轉(zhuǎn)1.map 轉(zhuǎn) struct2、struct 轉(zhuǎn) map二、struct, json 互轉(zhuǎn)三、map, json 互轉(zhuǎn)1.map 轉(zhuǎn) json2.json 轉(zhuǎn) map總結(jié)

本文用于記錄我在 golang 學(xué)習(xí)階段遇到的類型轉(zhuǎn)換問題,針對的是 json 、map、struct 之間相互轉(zhuǎn)換的問題,用到的技術(shù) json 、mapstructure、reflect 三個類庫

公共代碼區(qū)域

package mainimport ( 'encoding/json' 'fmt' 'testing')type UserInfoVo struct { Id string `json:'id'` UserName string `json:'user_name'` Address []AddressVo `json:'address'`}type AddressVo struct { Address string `json:'address'`}var beforeMap = map[string]interface{}{ 'id':'123', 'user_name': '酒窩豬', 'address': []map[string]interface{}{{'address': 'address01'}, {'address': 'address02'}},}var User UserInfoVofunc init() { User = UserInfoVo{ Id: '01', UserName: '酒窩豬', Address: []AddressVo{ { Address: '湖南', }, { Address: '北京', }, }, }}一、map, struct 互轉(zhuǎn)1.map 轉(zhuǎn) struct

map 轉(zhuǎn) struct 有兩種方式1.是通過第三方包 github.com/mitchellh/mapstructure2.通過 map 轉(zhuǎn) json,再通過 json 轉(zhuǎn) struct

第三方包 mapstructure

下載依賴,通過第三方依賴進行轉(zhuǎn)換

go get github.com/goinggo/mapstructure

func TestMapToStructByMod(t *testing.T) { var afterStruct =UserInfoVo{} before := time.Now() err := mapstructure.Decode(beforeMap, &afterStruct) if err!=nil{ fmt.Println(err) } fmt.Printf('result:%+v n',time.Since(before)) fmt.Printf('result:%+v n',afterStruct)}

result:61.757µs result:{Id:123 UserName: Address:[{Address:address01} {Address:address02}]} --- PASS: TestMapToStructByMod (0.00s)PASS

通過 JSON 進行轉(zhuǎn)換

先將 map 轉(zhuǎn)換成 JSON,再通過 JSON 轉(zhuǎn)換成 struct操作有點繁瑣

func TestMapToStructByJson(t *testing.T) { beforeMap := map[string]interface {}{ 'id':'123', 'user_name':'酒窩豬', 'address':[]map[string]interface{}{{'address': 'address01'}, {'address': 'address02'}}, } var afterStruct =UserInfoVo{} before := time.Now() marshal, err := json.Marshal(beforeMap) if err!=nil{ fmt.Println('marshal:',err) return } err = json.Unmarshal(marshal, &afterStruct) if err!=nil{ fmt.Println('unmarshal:',err) return } fmt.Println(time.Since(before)) fmt.Printf('resutlt: %+v',afterStruct)}

134.299µsresutlt: {Id:123 UserName:酒窩豬 Address:[{Address:address01} {Address:address02}]}--- PASS: TestMapToStructByJson (0.00s)PASS

總結(jié)問題:論性能哪個更佳?

根據(jù)結(jié)果答案使用 JSON 需要時間是 134.299µs使用 mapstructure 需要時間是 61.757µs結(jié)果是使用第三方包 mapstructure 性能更好,那么,是因為什么呢?暫且按下不表

2、struct 轉(zhuǎn) map

JSON 序列化轉(zhuǎn)換

先將 struct 轉(zhuǎn)換成字節(jié)數(shù)組,再將字節(jié)數(shù)組轉(zhuǎn)換成 map 打印

func TestStructToMapByJson(t *testing.T) { var resultMap interface{} before := time.Now() jsonMarshal, _ := json.Marshal(User) err := json.Unmarshal(jsonMarshal, &resultMap) if err != nil { fmt.Println(err) return } fmt.Println(time.Since(before)) fmt.Printf('%+v',resultMap)}

158.857µsmap[address:[map[address:湖南] map[address:北京]] id:01 user_name:酒窩豬]--- PASS: TestStructToMapByJson (0.00s)PASS

通過反射轉(zhuǎn)換

通過反射獲取 User 的類型與值

func TestStructToMapByReflect(t *testing.T) { var resultMap = make(map[string]interface{},10) before := time.Now() ty:=reflect.TypeOf(User) v:=reflect.ValueOf(User) for i := 0; i < v.NumField(); i++ { resultMap[strings.ToLower(ty.Field(i).Name)]=v.Field(i).Interface() } fmt.Println(time.Since(before)) fmt.Printf('%+v',resultMap)}

13.965µsmap[address:[{Address:湖南} {Address:北京}] id:01 username:酒窩豬]--- PASS: TestStructToMapByReflect (0.00s)PASS

總結(jié)問題:論性能哪個更佳?

答案是使用反射的效果更快點,沒有那么多繁瑣的轉(zhuǎn)換,記住在 make 中進行初始化大小,我試了下,不指定大小與指定大小時間上有 3~4µs 的區(qū)別網(wǎng)絡(luò)上還有一種方法是使用 structs 包,不過我看了下,該依賴包已經(jīng)三年沒更新了

二、struct, json 互轉(zhuǎn)

1. struct 轉(zhuǎn) json

func TestStructToJsonByJson(t *testing.T) { before := time.Now() marshal, _ := json.Marshal(User) fmt.Println(time.Since(before)) fmt.Printf('%s', marshal)}

116.068µs{'id':'01','user_name':'酒窩豬','address':[{'address':'湖南'},{'address':'北京'}]}--- PASS: TestStructToJsonByJson (0.00s)PASS

2.json 轉(zhuǎn) struct

func TestJsonToStructByJson(t *testing.T) { info:=UserInfoVo{} marshal, _ := json.Marshal(User) before := time.Now() json.Unmarshal(marshal,&info) fmt.Println(time.Since(before)) fmt.Printf('%+v',info)}

23.009µs{Id:01 UserName:酒窩豬 Address:[{Address:湖南} {Address:北京}]}--- PASS: TestJsonToStructByJson (0.00s)PASS

三、map, json 互轉(zhuǎn)1.map 轉(zhuǎn) json

func TestMapToJson(t *testing.T) { before := time.Now() marshal, _ := json.Marshal(beforeMap) fmt.Println(time.Since(before)) fmt.Printf('%s', marshal)}

75.133µs{'address':[{'address':'address01'},{'address':'address02'}],'id':'123','user_name':'酒窩豬'}--- PASS: TestMapToJson (0.00s)PASS

2.json 轉(zhuǎn) map

func TestJsonToMap(t *testing.T) { marshal, _ := json.Marshal(beforeMap) resultMap:=make(map[string]interface{},10) before := time.Now() json.Unmarshal(marshal,&resultMap) fmt.Println(time.Since(before)) fmt.Printf('%+v', resultMap)}

28.728µsmap[address:[map[address:address01] map[address:address02]] id:123 user_name:酒窩豬]--- PASS: TestJsonToMap (0.00s)PASS

總結(jié)

三者之間的轉(zhuǎn)換更多的是關(guān)于如果使用 json 內(nèi)庫,只有在 map 轉(zhuǎn) struct 使用了 mapstructure,struct 轉(zhuǎn) map 使用了反射,其他轉(zhuǎn)換,更多的是使用 json 內(nèi)置庫進行轉(zhuǎn)換

到此這篇關(guān)于golang struct, map, json之間的相互轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)golang struct, map, json 內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 劳动法网-专业的劳动法和劳动争议仲裁服务网| 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 苏商学院官网 - 江苏地区唯一一家企业家自办的前瞻型、实操型商学院 | 瑞典Blueair空气净化器租赁服务中心-专注新装修办公室除醛去异味服务! | 深圳活动策划公司|庆典策划|专业公关活动策划|深圳艺典文化传媒 重庆中专|职高|技校招生-重庆中专招生网 | 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | 合肥地磅_合肥数控切割机_安徽地磅厂家_合肥世佳电工设备有限公司 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 空调风机,低噪声离心式通风机,不锈钢防爆风机,前倾皮带传动风机,后倾空调风机-山东捷风风机有限公司 | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 昆明挖掘机修理厂_挖掘机翻新再制造-昆明聚力工程机械维修有限公司 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 直流大电流电源,燃料电池检漏设备-上海政飞 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 世纪豪门官网 世纪豪门集成吊顶加盟电话 世纪豪门售后电话 | 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 拉力机-万能试验机-材料拉伸试验机-电子拉力机-拉力试验机厂家-冲击试验机-苏州皖仪实验仪器有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 南京交通事故律师-专打交通事故的南京律师 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 耐热钢-耐磨钢-山东聚金合金钢铸造有限公司 | 无线讲解器-导游讲解器-自助讲解器-分区讲解系统 品牌生产厂家[鹰米讲解-合肥市徽马信息科技有限公司] | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 山东艾德实业有限公司| 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 车载加油机品牌_ 柴油加油机厂家| 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 |