2023-08-14 10:22:03來(lái)源:網(wǎng)管叨bi叨
今天給大家分享一個(gè)使用匿名結(jié)構(gòu)體,提升Go編程效率的小技巧,沒(méi)什么技術(shù)深度,屬于在日常寫代碼過(guò)程中積累下來(lái)的一個(gè)提升自己編程效率的小經(jīng)驗(yàn)。
(資料圖片僅供參考)
這個(gè)技巧之所以提效率主要體現(xiàn)在兩方面:
減少一些不會(huì)復(fù)用的類型定義節(jié)省糾結(jié)該給類型起什么名字的時(shí)間尤其第二項(xiàng),通過(guò)匿名結(jié)構(gòu)體這個(gè)名字就能體現(xiàn)出來(lái),它本身就沒(méi)有類型名,這能節(jié)省不少想名字的時(shí)間。再一個(gè)也能減少起錯(cuò)名字給其他人帶來(lái)的誤解,畢竟并不是所有人編程時(shí)都會(huì)按照英文的詞法做命名的。
下面我先從普通結(jié)構(gòu)體說(shuō)起,帶大家看看什么情形下用匿名結(jié)構(gòu)體會(huì)帶來(lái)編碼效率的提升。
具名結(jié)構(gòu)體具名結(jié)構(gòu)體就是平時(shí)用的普通結(jié)構(gòu)體。
結(jié)構(gòu)體大家都知道,用于把一組字段組織在一起,來(lái)在Go語(yǔ)言里抽象表達(dá)現(xiàn)實(shí)世界的事物,類似“藍(lán)圖”一樣。
比如說(shuō)定義一個(gè)名字為Car的結(jié)構(gòu)體在程序里表示“小汽車”
// 定義結(jié)構(gòu)體類型"car"type car struct { make string model string mileage int}
用到這個(gè)結(jié)構(gòu)體的地方通過(guò)其名字引用其即可,比如創(chuàng)建上面定義的結(jié)構(gòu)體的實(shí)例
// 創(chuàng)建car 的實(shí)例newCar := car{ make: "Ford", model: "taurus", mileage: 200000,}
匿名結(jié)構(gòu)體匿名結(jié)構(gòu)體顧名思義就是沒(méi)有名字的結(jié)構(gòu)體,通常只用于在代碼中僅使用一次的結(jié)構(gòu)類型,比如
func showMyCar() { newCar := struct { make string model string mileage int }{ make: "Ford", model: "Taurus", mileage: 200000, } fmt.Printlb(newCar.mode)}
上面這個(gè)函數(shù)中聲明的匿名結(jié)構(gòu)體賦值給了函數(shù)中的變量,所以只能在函數(shù)中使用。
如果一個(gè)結(jié)構(gòu)體初始化后只被使用一次,那么使用匿名結(jié)構(gòu)體就會(huì)很方便,不用在程序的package中定義太多的結(jié)構(gòu)體類型,比如在解析接口的響應(yīng)到結(jié)構(gòu)體后,就可以使用匿名結(jié)構(gòu)體
用于解析接口響應(yīng)func createCarHandler(w http.ResponseWriter, req *http.Request) { defer req.Body.Close() decoder := json.NewDecoder(req.Body) newCar := struct { Make string `json:"make"` Model string `json:"model"` Mileage int `json:"mileage"` }{} err := decoder.Decode(&newCar) if err != nil { log.Println(err) return } ...... return}
類似上面這種代碼一般在控制層寫,可以通過(guò)匿名結(jié)構(gòu)體實(shí)例解析到請(qǐng)求后再去創(chuàng)建對(duì)應(yīng)的DTO或者領(lǐng)域?qū)ο蠊┓?wù)層或者領(lǐng)域?qū)邮褂谩?/p>
有人會(huì)問(wèn)為什么不直接把API的響應(yīng)解析到DTO對(duì)象里,這里說(shuō)一下,匿名結(jié)構(gòu)體的使用場(chǎng)景是在覺(jué)得定一個(gè)Struct 不值得、不方便的情況下才用的。 比如程序拿到接口響應(yīng)后需要按業(yè)務(wù)規(guī)則加工下才能創(chuàng)建DTO實(shí)例這種情況,就很適合用匿名結(jié)構(gòu)體先解析響應(yīng)。
比用map更健壯這里再說(shuō)一點(diǎn)使用匿名結(jié)構(gòu)體的好處。
使用匿名解析接口響應(yīng)要比把響應(yīng)解析到map[string]interface{}類型的變量里要好很多,json數(shù)據(jù)解析到匿名結(jié)構(gòu)體的時(shí)候在解析的過(guò)程中會(huì)進(jìn)行類型檢查,會(huì)更安全。使用的時(shí)候直接通過(guò)s.FieldName訪問(wèn)字段也比map訪問(wèn)起來(lái)更方便和直觀。
用于定義項(xiàng)目約定的公共字段除了上面這種結(jié)構(gòu)體初始化后只使用一次的情況,在項(xiàng)目中定義各個(gè)接口的返回或者是DTO時(shí),有的公共字段使用匿名結(jié)構(gòu)體聲明類型也很方便。
一般在啟動(dòng)項(xiàng)目的時(shí)候我們都會(huì)約定項(xiàng)目提供的接口的響應(yīng)值結(jié)構(gòu),比如響應(yīng)里必須包含Code、Msg、Data三個(gè)字段,每個(gè)接口會(huì)再細(xì)分定義返回的Data的結(jié)構(gòu),這個(gè)時(shí)候用匿名結(jié)構(gòu)題能節(jié)省一部分編碼效率。
比如下面這個(gè)Reponse的結(jié)構(gòu)體類型的定義
type UserCouponResponse struct { Code int64 `json:"code"` Msg string `json:"message"` Data []*struct { CouponId int `json:"couponId"` ProdCode string `json:"prodCode"` UserId int64 `json:"userId"` CouponStatus int `json:"couponStatus"` DiscountPercentage int `json:"discount"` } `json:"data"`}
就省的先去定義一個(gè)UserCoupon類型
type UserCoupon struct { CouponId int `json:"couponId"` ProdCode string `json:"prodCode"` UserId int64 `json:"userId"` CouponStatus int `json:"couponStatus"` DiscountPercentage int `json:"discount"`}
再在Response聲明里使用定義的UserCoupon了
type UserCouponResponse struct { Code int64 `json:"code"` Msg string `json:"message"` Data []*UserCoupon `json:"data"`}
當(dāng)然如果UserCoupon是你的項(xiàng)目其他地方也會(huì)用到的類型,那么先聲明,順帶在Response結(jié)構(gòu)體里也使用是沒(méi)問(wèn)題的,只要會(huì)多次用到的類型都建議聲明成正常的結(jié)構(gòu)體類型。
還是那句話匿名結(jié)構(gòu)體只在你覺(jué)得"這還要定義個(gè)類型?”時(shí)候使用,用好的確實(shí)能提高點(diǎn)代碼生產(chǎn)效率。
總結(jié)本次的分享就到這里了,內(nèi)容比較簡(jiǎn)單,記住這個(gè)口訣:匿名結(jié)構(gòu)體只在你寫代碼時(shí)覺(jué)得這還要定義個(gè)類型,感覺(jué)沒(méi)必要的時(shí)候使用,采納這個(gè)技巧,時(shí)間長(zhǎng)了還是能看到一些自己效率的提高的。
關(guān)鍵詞:
今天給大家分享一個(gè)使用匿名結(jié)構(gòu)體,提升Go編程效率的小技巧,沒(méi)什么技
這是個(gè)“瘋子”程序員,在長(zhǎng)達(dá)四年半的時(shí)間內(nèi),每周7天,每天工作10個(gè)
虛擬現(xiàn)實(shí)(VR)正在為員工提供更好的培訓(xùn)、促進(jìn)協(xié)作、優(yōu)化流程,并提高安
RabbitMQ是一個(gè)強(qiáng)大的消息中間件,可以幫助構(gòu)建高可靠性、可擴(kuò)展和靈活
新聞早知道丨“紅眼病”“泳者耳”進(jìn)入高發(fā)期夏季游泳慎防感染
孕婦在生完孩子以后身體是非常虛弱的,身體各方面的機(jī)能都在逐漸的下降
反射的引入【1】反射可以做什么?1)反射可以在運(yùn)行時(shí)動(dòng)態(tài)獲取變量的各
“我真的好開心,我這次終于不用在這個(gè)賽道上陪跑,我今天是沖線的那一
1、摁jk二玩家摁12(一起而且有三格氣)。本文到此分享完畢,希望對(duì)大
今天分享5個(gè)很實(shí)用的指令,這幾個(gè)指令很多時(shí)候?qū)ξ覀冚敵鰞?nèi)容的連貫性
學(xué)習(xí)有效的代碼審查最佳實(shí)踐和技巧。通過(guò)專家的建議和洞察力提高代碼質(zhì)
如圖所示,云電腦對(duì)網(wǎng)絡(luò)強(qiáng)依賴,沒(méi)有網(wǎng)絡(luò),云電腦無(wú)法使用,所以網(wǎng)絡(luò)環(huán)
不斷變化的行業(yè)定期經(jīng)歷結(jié)構(gòu)性變化,刺激新的價(jià)值創(chuàng)造,并實(shí)現(xiàn)內(nèi)容和通
高盛集團(tuán)經(jīng)濟(jì)學(xué)家預(yù)計(jì),美聯(lián)儲(chǔ)今年不會(huì)再加息,并將于明年6月末開始降
阿根廷羅薩里奧谷物交易所網(wǎng)站近日?qǐng)?bào)道,受降水缺乏影響,交易所預(yù)計(jì)20