Go中匿名結(jié)構(gòu)體的使用技巧
今天給大家分享一個使用匿名結(jié)構(gòu)體,提升Go編程效率的小技巧,沒什么技術(shù)深度,屬于在日常寫代碼過程中積累下來的一個提升自己編程效率的小經(jīng)驗。
這個技巧之所以提效率主要體現(xiàn)在兩方面:
- 減少一些不會復(fù)用的類型定義
- 節(jié)省糾結(jié)該給類型起什么名字的時間
尤其第二項,通過匿名結(jié)構(gòu)體這個名字就能體現(xiàn)出來,它本身就沒有類型名,這能節(jié)省不少想名字的時間。再一個也能減少起錯名字給其他人帶來的誤解,畢竟并不是所有人編程時都會按照英文的詞法做命名的。
下面我先從普通結(jié)構(gòu)體說起,帶大家看看什么情形下用匿名結(jié)構(gòu)體會帶來編碼效率的提升。
具名結(jié)構(gòu)體
具名結(jié)構(gòu)體就是平時用的普通結(jié)構(gòu)體。
結(jié)構(gòu)體大家都知道,用于把一組字段組織在一起,來在Go語言里抽象表達現(xiàn)實世界的事物,類似“藍圖”一樣。
比如說定義一個名字為Car的結(jié)構(gòu)體在程序里表示“小汽車”
//?定義結(jié)構(gòu)體類型'car' type?car?struct?{ ????make????string ????model???string ????mileage?int }
用到這個結(jié)構(gòu)體的地方通過其名字引用其即可,比如創(chuàng)建上面定義的結(jié)構(gòu)體的實例
//?創(chuàng)建car?的實例 newCar?:=?car{ ????make:????"Ford", ????model:???"taurus", ????mileage:?200000, }
匿名結(jié)構(gòu)體
匿名結(jié)構(gòu)體顧名思義就是沒有名字的結(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) }
上面這個函數(shù)中聲明的匿名結(jié)構(gòu)體賦值給了函數(shù)中的變量,所以只能在函數(shù)中使用。
如果一個結(jié)構(gòu)體初始化后只被使用一次,那么使用匿名結(jié)構(gòu)體就會很方便,不用在程序的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 }
類似上面這種代碼一般在控制層寫,可以通過匿名結(jié)構(gòu)體實例解析到請求后再去創(chuàng)建對應(yīng)的DTO或者領(lǐng)域?qū)ο蠊┓?wù)層或者領(lǐng)域?qū)邮褂谩?/p>
有人會問為什么不直接把API的響應(yīng)解析到DTO對象里,這里說一下,匿名結(jié)構(gòu)體的使用場景是在覺得定一個Struct 不值得、不方便的情況下才用的。 比如程序拿到接口響應(yīng)后需要按業(yè)務(wù)規(guī)則加工下才能創(chuàng)建DTO實例這種情況,就很適合用匿名結(jié)構(gòu)體先解析響應(yīng)。
比用map更健壯
這里再說一點使用匿名結(jié)構(gòu)體的好處。
使用匿名解析接口響應(yīng)要比把響應(yīng)解析到map[string]interface{}
類型的變量里要好很多,json數(shù)據(jù)解析到匿名結(jié)構(gòu)體的時候在解析的過程中會進行類型檢查,會更安全。使用的時候直接通過s.FieldName
訪問字段也比map
訪問起來更方便和直觀。
用于定義項目約定的公共字段
除了上面這種結(jié)構(gòu)體初始化后只使用一次的情況,在項目中定義各個接口的返回或者是DTO時,有的公共字段使用匿名結(jié)構(gòu)體聲明類型也很方便。
一般在啟動項目的時候我們都會約定項目提供的接口的響應(yīng)值結(jié)構(gòu),比如響應(yīng)里必須包含Code
、Msg
、Data
三個字段,每個接口會再細分定義返回的Data的結(jié)構(gòu),這個時候用匿名結(jié)構(gòu)題能節(jié)省一部分編碼效率。
比如下面這個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"` }
就省的先去定義一個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"` }
當然如果UserCoupon是你的項目其他地方也會用到的類型,那么先聲明,順帶在Response結(jié)構(gòu)體里也使用是沒問題的,只要會多次用到的類型都建議聲明成正常的結(jié)構(gòu)體類型。
還是那句話匿名結(jié)構(gòu)體只在你覺得"這還要定義個類型?”時候使用,用好的確實能提高點代碼生產(chǎn)效率。
到此這篇關(guān)于Go中匿名結(jié)構(gòu)體的使用技巧的文章就介紹到這了,更多相關(guān)Go匿名結(jié)構(gòu)體內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- golang使用泛型結(jié)構(gòu)體實現(xiàn)封裝切片
- go語言中結(jié)構(gòu)體tag使用小結(jié)
- Golang?中判斷兩個結(jié)構(gòu)體相等的方法
- Go語言中結(jié)構(gòu)體的高級技巧分享
- 詳解Golang time包中的結(jié)構(gòu)體time.Ticker
- 詳解Golang time包中的結(jié)構(gòu)體time.Time
- 詳解Go語言中的結(jié)構(gòu)體的特性
- 一文帶你感受Go語言空結(jié)構(gòu)體的魔力
- 細說Go語言中空結(jié)構(gòu)體的奇妙用途
- 一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
- 深入理解Go語言中的結(jié)構(gòu)體
相關(guān)文章
Go框架三件套Gorm?Kitex?Hertz基本用法與常見API講解
這篇文章主要為大家介紹了Go框架三件套Gorm?Kitex?Hertz的基本用法與常見API講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-02-02Go語言實現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法
這篇文章主要介紹了Go語言實現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法,以實例形式詳細分析了幾種常見的排序技巧與實現(xiàn)方法,非常具有實用價值,需要的朋友可以參考下2015-02-02Go語言標準庫sync.Once使用場景及性能優(yōu)化詳解
這篇文章主要為大家介紹了Go語言標準庫sync.Once使用場景及性能優(yōu)化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12golang的匿名函數(shù)和普通函數(shù)的區(qū)別解析
匿名函數(shù)是不具名的函數(shù),可以在不定義函數(shù)名的情況下直接使用,通常用于函數(shù)內(nèi)部的局部作用域中,這篇文章主要介紹了golang的匿名函數(shù)和普通函數(shù)的區(qū)別,需要的朋友可以參考下2023-03-03