亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言高效編程的3個技巧總結(jié)

 更新時間:2023年01月03日 15:19:19   作者:InterestingFigure  
Go語言是一種開源編程語言,可輕松構(gòu)建簡單、可靠且高效的軟件,下面這篇文章主要給大家分享介紹了關(guān)于Go語言高效編程的3個技巧,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

不要使用Logrus

這其實(shí)和泛型有關(guān)。因?yàn)镚o語言是一門強(qiáng)類型的靜態(tài)語言,所以你不可能像NodeJS或者PHP那樣繞過數(shù)據(jù)類型。那如果我們還需要使用通用的類型怎么辦呢?比如像Loger,或者ORM,因?yàn)橹挥惺褂昧送ㄓ玫念愋?,才能編寫出通用的代碼,不然每個都要寫一次。

最終,我們只能用反射。而 Logrus 大量使用反射,這導(dǎo)致大量分配計(jì)數(shù)。雖然通常不是一個大問題(取決于代碼),但性能很重要,尤其是在大規(guī)模、高并發(fā)的項(xiàng)目中。雖然這聽起來像是一個非常小的優(yōu)化,但避免反射很重要。如果你看到一些可以不考慮類型而使用結(jié)構(gòu)的代碼,它會使用反射并且會對性能產(chǎn)生影響。

例如,Logrus 并不關(guān)心類型,但顯然 Go 需要知道(最終)。Logrus 怎么辦呢?使用反射來檢測類型,這是開銷。

log.WithFields(log.Fields{<!--{C}%3C!%2D%2D%20%2D%2D%3E-->
“animal”: myWhatever,
}).Info(“A walrus appears”)

所以我會更喜歡zerolog,當(dāng)然zap也不錯。兩者都宣稱零分配,這也是我們希望的,因?yàn)樗鼈兊男阅苡绊懽钚 ?/p>

不要使用encoding/json

當(dāng)我們需要一個功能、函數(shù)的時候,很多人都建議使用標(biāo)準(zhǔn)庫。但是標(biāo)準(zhǔn)庫中的encoding/json模塊是個例外。其實(shí)也和上面的例子一樣,encoding/json使用反射,這會導(dǎo)致性能不高,并且在編寫返回 json 響應(yīng)的 API 、或者微服務(wù)時會造成損失。

比如你可以使用 Easyjson,它很簡單,也很高效,它是使用代碼生成器來創(chuàng)建將結(jié)構(gòu)轉(zhuǎn)換為 json 所需的代碼,以最大限度地減少分配。這是一個手動構(gòu)建步驟,很煩人。有趣的是json-iterator也使用反射,但速度明顯更快,我懷疑是黑魔法。

盡可能不要在goroutine中使用閉包

比如,下面這個示例代碼:

for i:=0;i<10;i++ {
  go func() {
     fmt.Println(i)
  }()
}

大多數(shù)人可能期望這會打印數(shù)字 0 到 9,就像將任務(wù)委托給 goroutine 時那樣。

但是實(shí)際結(jié)果:根據(jù)系統(tǒng),你將得到一兩個數(shù)字和許多 10。

為什么會這樣?閉包可以訪問父作用域,因此可以直接使用變量。盡管更新的 linters 可能會警告你“變量閉包捕獲”,但并不會要求你重新聲明該變量。

Go 的性能名聲很大程度上歸功于執(zhí)行的運(yùn)行時優(yōu)化,它嘗試“猜測”你想要做什么并優(yōu)化某些執(zhí)行路徑。在此期間,它“捕獲”變量并以理論上最有效的方式將它們傳遞到需要它們的地方(例如,在完成一些非并發(fā)操作以釋放某些 CPU 上的分配之后)。這種情況下的結(jié)果是循環(huán)可能會啟動 goroutines,goroutines可能會在很晚之后從父作用域接收到 i 的值。不能保證在多次執(zhí)行此代碼時你會看到哪個,可能是數(shù)字10,也可以是其他數(shù)字。

如果你出于某種原因確實(shí)使用了閉包,一定要傳遞變量i,就像對待每個函數(shù)一樣對待閉包。

總結(jié)

到此這篇關(guān)于Go語言高效編程的3個技巧總結(jié)的文章就介紹到這了,更多相關(guān)Go語言高效編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中異常處理機(jī)制詳解

    Golang中異常處理機(jī)制詳解

    這篇文章主要給大家介紹了關(guān)于Golang中異常處理機(jī)制的相關(guān)資料,其實(shí)Go語言的異常捕獲要比Python中簡單的多,它沒有Python中那么多復(fù)雜的異常類型及繼承體系,需要的朋友可以參考下
    2021-06-06
  • 使用Go語言創(chuàng)建WebSocket服務(wù)的實(shí)現(xiàn)示例

    使用Go語言創(chuàng)建WebSocket服務(wù)的實(shí)現(xiàn)示例

    這篇文章主要介紹了使用Go語言創(chuàng)建WebSocket服務(wù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Golang使用Gin創(chuàng)建Restful API的實(shí)現(xiàn)

    Golang使用Gin創(chuàng)建Restful API的實(shí)現(xiàn)

    本文主要介紹了Golang使用Gin創(chuàng)建Restful API的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • GO語言實(shí)現(xiàn)文件上傳代碼分享

    GO語言實(shí)現(xiàn)文件上傳代碼分享

    本文給大家分享的是一則使用golang實(shí)現(xiàn)文件上傳的代碼,主要是使用os.Create創(chuàng)建文件,io.Copy來保存文件,思路非常清晰,這里推薦給大家,有需要的小伙伴參考下吧。
    2015-03-03
  • 一文帶你深入理解Golang中的泛型

    一文帶你深入理解Golang中的泛型

    Go?在泛型方面一直被詬病,因?yàn)樗谶@方面相對比較落后。但是,在?Go?1.18?版本中,泛型已經(jīng)被正式引入,成為了?Go?語言中一個重要的特性。本文將會詳細(xì)介紹?Go?泛型的相關(guān)概念,語法和用法,希望能夠幫助大家更好地理解和應(yīng)用這一特性
    2023-05-05
  • Golang超全面講解并發(fā)

    Golang超全面講解并發(fā)

    goroutine?不是os線程、不是綠色線程(由語言運(yùn)行時管理的線程),是協(xié)程。協(xié)程是一種非搶占式的簡單并發(fā)子goroutine(函數(shù)、閉包或方法),也就是說,它們不能被中斷。取而代之的是,協(xié)程有多個點(diǎn),允許暫停或重新進(jìn)入?—Go語言并發(fā)之道
    2022-06-06
  • Golang error使用場景介紹

    Golang error使用場景介紹

    我們在使用Golang時,不可避免會遇到異常情況的處理,與Java、Python等語言不同的是,Go中并沒有try...catch...這樣的語句塊,這個時候我們?nèi)绾尾拍芨玫奶幚懋惓D??本文來教你正確方法
    2023-03-03
  • Golang中四種gRPC模式舉例詳解

    Golang中四種gRPC模式舉例詳解

    gRPC是一種進(jìn)程間通信技術(shù),在微服務(wù)和云原生領(lǐng)域都有著廣泛的應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于Golang中四種gRPC模式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • go語言在請求http時加入自定義http header的方法

    go語言在請求http時加入自定義http header的方法

    這篇文章主要介紹了go語言在請求http時加入自定義http header的方法,實(shí)例分析了Go語言http請求的原理與操作技巧,需要的朋友可以參考下
    2015-03-03
  • Go 如何使用原始套接字捕獲網(wǎng)卡流量

    Go 如何使用原始套接字捕獲網(wǎng)卡流量

    為了減少對環(huán)境的依賴可以使用原始套接字捕獲網(wǎng)卡流量,然后使用?gopacket?的協(xié)議解析功能,這樣就省去了解析這部分的工作量,正確性也可以得到保證,同時 CGO 也可以關(guān)閉,這篇文章主要介紹了Go 使用原始套接字捕獲網(wǎng)卡流量,需要的朋友可以參考下
    2024-07-07

最新評論