欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go中匿名結(jié)構(gòu)體的使用技巧

 更新時(shí)間:2023年08月21日 08:18:20   作者:網(wǎng)管叨bi叨  
這篇文章主要給大家分享一個(gè)使用匿名結(jié)構(gòu)體,提升Go編程效率的小技巧,沒什么技術(shù)深度,屬于在日常寫代碼過程中積累下來的一個(gè)提升自己編程效率的小經(jīng)驗(yàn)

今天給大家分享一個(gè)使用匿名結(jié)構(gòu)體,提升Go編程效率的小技巧,沒什么技術(shù)深度,屬于在日常寫代碼過程中積累下來的一個(gè)提升自己編程效率的小經(jīng)驗(yàn)。

這個(gè)技巧之所以提效率主要體現(xiàn)在兩方面:

  • 減少一些不會(huì)復(fù)用的類型定義
  • 節(jié)省糾結(jié)該給類型起什么名字的時(shí)間

尤其第二項(xiàng),通過匿名結(jié)構(gòu)體這個(gè)名字就能體現(xiàn)出來,它本身就沒有類型名,這能節(jié)省不少想名字的時(shí)間。再一個(gè)也能減少起錯(cuò)名字給其他人帶來的誤解,畢竟并不是所有人編程時(shí)都會(huì)按照英文的詞法做命名的。

下面我先從普通結(jié)構(gòu)體說起,帶大家看看什么情形下用匿名結(jié)構(gòu)體會(huì)帶來編碼效率的提升。

具名結(jié)構(gòu)體

具名結(jié)構(gòu)體就是平時(shí)用的普通結(jié)構(gòu)體。

結(jié)構(gòu)體大家都知道,用于把一組字段組織在一起,來在Go語言里抽象表達(dá)現(xiàn)實(shí)世界的事物,類似“藍(lán)圖”一樣。

比如說定義一個(gè)名字為Car的結(jié)構(gòu)體在程序里表示“小汽車”

//?定義結(jié)構(gòu)體類型'car'
type?car?struct?{
????make????string
????model???string
????mileage?int
}

用到這個(gè)結(jié)構(gòu)體的地方通過其名字引用其即可,比如創(chuàng)建上面定義的結(jié)構(gòu)體的實(shí)例

//?創(chuàng)建car?的實(shí)例
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)
}

上面這個(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
}

類似上面這種代碼一般在控制層寫,可以通過匿名結(jié)構(gòu)體實(shí)例解析到請(qǐng)求后再去創(chuàng)建對(duì)應(yīng)的DTO或者領(lǐng)域?qū)ο蠊┓?wù)層或者領(lǐng)域?qū)邮褂谩?/p>

有人會(huì)問為什么不直接把API的響應(yīng)解析到DTO對(duì)象里,這里說一下,匿名結(jié)構(gòu)體的使用場(chǎng)景是在覺得定一個(gè)Struct 不值得、不方便的情況下才用的。 比如程序拿到接口響應(yīng)后需要按業(yè)務(wù)規(guī)則加工下才能創(chuàng)建DTO實(shí)例這種情況,就很適合用匿名結(jié)構(gòu)體先解析響應(yīng)。

比用map更健壯

這里再說一點(diǎn)使用匿名結(jié)構(gòu)體的好處。

使用匿名解析接口響應(yīng)要比把響應(yīng)解析到map[string]interface{}類型的變量里要好很多,json數(shù)據(jù)解析到匿名結(jié)構(gòu)體的時(shí)候在解析的過程中會(huì)進(jìn)行類型檢查,會(huì)更安全。使用的時(shí)候直接通過s.FieldName訪問字段也比map訪問起來更方便和直觀。

用于定義項(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)里必須包含CodeMsg、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)體里也使用是沒問題的,只要會(huì)多次用到的類型都建議聲明成正常的結(jié)構(gòu)體類型。

還是那句話匿名結(jié)構(gòu)體只在你覺得"這還要定義個(gè)類型?”時(shí)候使用,用好的確實(shí)能提高點(diǎn)代碼生產(chǎn)效率。

到此這篇關(guān)于Go中匿名結(jié)構(gòu)體的使用技巧的文章就介紹到這了,更多相關(guān)Go匿名結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go框架三件套Gorm?Kitex?Hertz基本用法與常見API講解

    Go框架三件套Gorm?Kitex?Hertz基本用法與常見API講解

    這篇文章主要為大家介紹了Go框架三件套Gorm?Kitex?Hertz的基本用法與常見API講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-02-02
  • 詳解如何使用Bazel構(gòu)建Golang程序

    詳解如何使用Bazel構(gòu)建Golang程序

    這篇文章主要為大家介紹了如何使用Bazel構(gòu)建Golang程序?qū)嵗斀猓行枰呐笥芽梢越梃b參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Go語言基礎(chǔ)反射示例詳解

    Go語言基礎(chǔ)反射示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)關(guān)于反射示例的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • Golang?HTTP編程的源碼解析詳解

    Golang?HTTP編程的源碼解析詳解

    這篇文章主要為大家詳細(xì)介紹了Golang中的HTTP編程以及源碼解析,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下
    2023-02-02
  • Go語言實(shí)現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法

    Go語言實(shí)現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法

    這篇文章主要介紹了Go語言實(shí)現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法,以實(shí)例形式詳細(xì)分析了幾種常見的排序技巧與實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語言標(biāo)準(zhǔn)庫sync.Once使用場(chǎng)景及性能優(yōu)化詳解

    Go語言標(biāo)準(zhǔn)庫sync.Once使用場(chǎng)景及性能優(yōu)化詳解

    這篇文章主要為大家介紹了Go語言標(biāo)準(zhǔn)庫sync.Once使用場(chǎng)景及性能優(yōu)化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • go語言的初始化順序,包,變量,init詳解

    go語言的初始化順序,包,變量,init詳解

    這篇文章主要介紹了go語言的初始化順序,包,變量,init詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang map與sync.map的異同詳解

    Golang map與sync.map的異同詳解

    在Go語言中,map和sync.Map都是用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),但它們?cè)诓l(fā)安全性、性能和使用場(chǎng)景上存在顯著差異,接下來將深入探討這兩種數(shù)據(jù)結(jié)構(gòu)的異同,感興趣的朋友可以參考下
    2024-01-01
  • 利用rpm打包上線部署golang代碼的方法教程

    利用rpm打包上線部署golang代碼的方法教程

    RPM是RPM Package Manager(RPM軟件包管理器)的縮寫,這篇文章主要給大家介紹了關(guān)于利用rpm打包上線部署golang代碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • golang的匿名函數(shù)和普通函數(shù)的區(qū)別解析

    golang的匿名函數(shù)和普通函數(shù)的區(qū)別解析

    匿名函數(shù)是不具名的函數(shù),可以在不定義函數(shù)名的情況下直接使用,通常用于函數(shù)內(nèi)部的局部作用域中,這篇文章主要介紹了golang的匿名函數(shù)和普通函數(shù)的區(qū)別,需要的朋友可以參考下
    2023-03-03

最新評(píng)論