最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

今天給大家分享一個使用匿名結(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)里必須包含CodeMsg、Data三個字段,每個接口會再細(xì)分定義返回的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"`
}

當(dāng)然如果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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Golang的new與make區(qū)別是什么

    淺談Golang的new與make區(qū)別是什么

    本文主要介紹了Golang的new與make區(qū)別是什么,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Golang Gin框架實現(xiàn)文件下載功能的示例代碼

    Golang Gin框架實現(xiàn)文件下載功能的示例代碼

    本文主要介紹了Golang Gin框架實現(xiàn)文件下載功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go設(shè)計模式之備忘錄模式圖文詳解

    Go設(shè)計模式之備忘錄模式圖文詳解

    備忘錄模式是一種行為設(shè)計模式, 允許在不暴露對象實現(xiàn)細(xì)節(jié)的情況下保存和恢復(fù)對象之前的狀態(tài),本文主要通過一些圖片來給大家介紹一下Go的備忘錄模式,需要的朋友可以參考下
    2023-08-08
  • golang socket斷點續(xù)傳大文件的實現(xiàn)方法

    golang socket斷點續(xù)傳大文件的實現(xiàn)方法

    今天小編就為大家分享一篇golang socket斷點續(xù)傳大文件的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 詳解如何用Golang處理每分鐘100萬個請求

    詳解如何用Golang處理每分鐘100萬個請求

    在項目開發(fā)中,我們常常會遇到處理來自數(shù)百萬個端點的大量POST請求,本文主要介紹了Golang實現(xiàn)處理每分鐘100萬個請求的方法,希望對大家有所幫助
    2023-04-04
  • 基于Golang開發(fā)一個輕量級登錄庫/框架

    基于Golang開發(fā)一個輕量級登錄庫/框架

    幾乎每個項目都會有登錄,退出等用戶功能,而登錄又不單僅僅是登錄,我們要考慮很多東西。所以本文就來用Golang開發(fā)一個輕量級登錄庫/框架吧
    2023-05-05
  • Go語言實現(xiàn)配置熱加載的方法分享

    Go語言實現(xiàn)配置熱加載的方法分享

    web項目,經(jīng)常需要熱啟動各種各樣的配置信息,一旦這些服務(wù)發(fā)生變更,我們需要重新啟動web server,以使配置生效,實現(xiàn)配置熱加載,本文為大家整理了幾個方法實現(xiàn)這個需求,需要的可以參考下
    2023-05-05
  • Go代碼的組織和格式化規(guī)則實戰(zhàn)示例

    Go代碼的組織和格式化規(guī)則實戰(zhàn)示例

    這篇文章主要為大家介紹了Go代碼的組織和格式化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • golang使用redis實現(xiàn)全文搜索功能詳解

    golang使用redis實現(xiàn)全文搜索功能詳解

    這篇文章主要為大家詳細(xì)介紹了golang如何使用redis實現(xiàn)全文搜索功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Golang內(nèi)存泄漏詳解之原因、檢測與修復(fù)過程

    Golang內(nèi)存泄漏詳解之原因、檢測與修復(fù)過程

    本文詳細(xì)介紹了Golang中的內(nèi)存泄漏問題,包括內(nèi)存泄漏的定義、分類、影響以及預(yù)防和修復(fù)方法,通過使用Golang自帶的性能分析工具和火焰圖工具,可以有效地檢測和定位內(nèi)存泄漏的代碼路徑,合理的代碼設(shè)計和定期的代碼審查也是預(yù)防內(nèi)存泄漏的關(guān)鍵
    2024-12-12

最新評論

凤翔县| 中宁县| 孟州市| 增城市| 射洪县| 霍邱县| 天津市| 炉霍县| 杭锦旗| 博罗县| 江源县| 普定县| 治县。| 靖远县| 吴江市| 安阳市| 海南省| 彭山县| 介休市| 会昌县| 六安市| 安溪县| 广西| 深水埗区| 和林格尔县| 白水县| 金塔县| 上高县| 天津市| 恩平市| 睢宁县| 玛纳斯县| 万全县| 保山市| 合肥市| 互助| 越西县| 汝南县| 嫩江县| 隆林| 通州市|