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

go goroutine 怎樣進(jìn)行錯(cuò)誤處理

 更新時(shí)間:2021年07月16日 10:15:40   作者:mb60e703e6a8897  
在 Go 語(yǔ)言程序開(kāi)發(fā)中,goroutine 的使用是比較頻繁的,因此在日常編碼的時(shí)候 goroutine 里的錯(cuò)誤處理,怎么做會(huì)比較好呢,本文就來(lái)詳細(xì)介紹一下

前言

在 Go 語(yǔ)言程序開(kāi)發(fā)中,goroutine 的使用是比較頻繁的,因此在日常編碼的時(shí)候 goroutine 里的錯(cuò)誤處理,怎么做會(huì)比較好呢?

一般我們的業(yè)務(wù)代碼如下:

func main() {
 var wg sync.WaitGroup
 wg.Add(2)
 go func() {
  //... 業(yè)務(wù)邏輯
  wg.Done()
 }()
 go func() {
  //... 業(yè)務(wù)邏輯
  wg.Done()
 }()
 wg.Wait()
}

在上面的代碼中,我們運(yùn)行了多個(gè) goroutine,每個(gè)協(xié)程又是單獨(dú)行動(dòng)的,想要拋出 error 錯(cuò)誤信息,也不怎么明智。

通過(guò)錯(cuò)誤日志記錄

常用的第一種方法:通過(guò)把錯(cuò)誤記錄寫(xiě)入到日志文件中,再結(jié)合相關(guān)的 logtail 進(jìn)行采集和梳理。

但這又會(huì)引入新的問(wèn)題,那就是調(diào)用錯(cuò)誤日志的方法寫(xiě)的到處都是,代碼結(jié)構(gòu)也比較亂、不直觀。

最重要的是無(wú)法針對(duì) error 做特定的邏輯處理和流轉(zhuǎn)。

利用 channel 傳輸

大家可能會(huì)想到 Go 的經(jīng)典哲學(xué):不要通過(guò)共享內(nèi)存來(lái)通信,而是通過(guò)通信來(lái)實(shí)現(xiàn)內(nèi)存共享(Do not communicate by sharing memory; instead, share memory by communicating)。

第二種方法:利用 channel 來(lái)傳輸多個(gè) goroutine 中的 errors:

func main() {
 cherrors := make(chan error)
 wgDone := make(chan bool)

 var wg sync.WaitGroup
 wg.Add(2)
 go func() {
  //... 業(yè)務(wù)邏輯
  wg.Done()
 }()
 go func() {
  //... 業(yè)務(wù)邏輯
  err := returnErr()
  if err != nil {
   cherrors <- err
  }
  wg.Done()
 }()
 go func() {
  wg.Wait()
  close(wgDone)
 }()

 select {
 case <-wgDone:
  break
 case err := <-cherrors:
  close(cherrors)
  fmt.Println(err)
 }

 time.Sleep(time.Second)
}

func returnErr() error {
 return errors.New("出錯(cuò)啦。。我是錯(cuò)誤信息")
}

雖然使用 channel 后已經(jīng)方便了不少,但編寫(xiě) channel 還要關(guān)心一些非業(yè)務(wù)向的邏輯。

使用 sync/errgroup

第三種方法,就是使用官方提供的 golang.org/x/sync/errgroup 標(biāo)準(zhǔn)庫(kù):

type Group
    func WithContext(ctx context.Context) (*Group, context.Context)
    func (g *Group) Go(f func() error)
    func (g *Group) Wait() error
  • Go:?jiǎn)?dòng)一個(gè)協(xié)程,在新的 goroutine 中調(diào)用給定的函數(shù)。
  • Wait:等待協(xié)程結(jié)束,直到 Go 方法中的所有函數(shù)調(diào)用都返回,然后返回其中第一個(gè)非零錯(cuò)誤(如果有錯(cuò)誤的話)。

結(jié)合其特性能夠非常便捷的針對(duì)多 goroutine 進(jìn)行錯(cuò)誤處理:

func main() {
 group := new(errgroup.Group)

 nums := []int{-1, 0, 1}
 for _, num := range nums {
  num := num
  group.Go(func() error {
   res, err := output(num)
   fmt.Println(res)
   return err
  })
 }

 if err := group.Wait(); err != nil {
  fmt.Println("Get errors: ", err)
 } else {
  fmt.Println("Get all num successfully!")
 }
}

func output(num int) (int, error) {
 if num < 0 {
  return 0, errors.New("math: square root error!")
 }
 return num, nil
}

每啟動(dòng)一個(gè)新的 goroutine 都直接使用 Group.Go 方法,在等待和錯(cuò)誤處理上使用 Group.Wait 方法。

這種方法進(jìn)行錯(cuò)誤處理的好處是不需要關(guān)注非業(yè)務(wù)邏輯的控制代碼,比較簡(jiǎn)潔明了。

總結(jié)

在 Go 語(yǔ)言中,goroutine 是一種常用的方法,為此我們需要更了解 goroutine 的一系列相關(guān)知識(shí),像是 context、error處理等

在團(tuán)隊(duì)開(kāi)發(fā)中,統(tǒng)一一定的規(guī)范,這樣的代碼閱讀起來(lái)就會(huì)比較明朗,一些隱藏很深的 Bug 也會(huì)減少很多。

到此這篇關(guān)于go goroutine 怎樣進(jìn)行錯(cuò)誤處理的文章就介紹到這了,更多相關(guān)go goroutine 錯(cuò)誤處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang協(xié)程與線程區(qū)別簡(jiǎn)要介紹

    golang協(xié)程與線程區(qū)別簡(jiǎn)要介紹

    這篇文章主要介紹了golang協(xié)程與線程區(qū)別簡(jiǎn)要介紹,進(jìn)程是操作系統(tǒng)資源分配的基本單位,是程序運(yùn)行的實(shí)例,線程是操作系統(tǒng)調(diào)度到CPU中執(zhí)行的基本單位
    2022-06-06
  • Go語(yǔ)言中的自定義類型你了解嗎

    Go語(yǔ)言中的自定義類型你了解嗎

    自定義類型是 Go 語(yǔ)言中非常重要的概念之一,通過(guò)自定義類型,我們可以更好地封裝數(shù)據(jù)、組織代碼,提高程序的可讀性和可維護(hù)性。本文將從以下幾個(gè)方面介紹 Go 自定義類型的相關(guān)知識(shí),感興趣的可以了解一下
    2023-04-04
  • Go語(yǔ)言快速入門圖文教程

    Go語(yǔ)言快速入門圖文教程

    Go是 Goolge 開(kāi)發(fā)的一種靜態(tài)型、編譯型、并發(fā)型,并具有垃圾回收功能的語(yǔ)言,Go 語(yǔ)言上手非常容易,它的風(fēng)格類似于 C 語(yǔ)言,Go 語(yǔ)言號(hào)稱是互聯(lián)網(wǎng)時(shí)代的 C 語(yǔ)言,那么它到底有多火呢,一起看看吧
    2021-05-05
  • Go語(yǔ)言中的格式化占位符的實(shí)現(xiàn)示例

    Go語(yǔ)言中的格式化占位符的實(shí)現(xiàn)示例

    在Go語(yǔ)言中,fmt包提供了豐富的格式化占位符用于輸出不同類型的數(shù)據(jù),了解和選擇合適的占位符對(duì)于確保輸出內(nèi)容的正確性和可讀性至關(guān)重要,本文就來(lái)介紹一下,感興趣的可以學(xué)習(xí)
    2024-10-10
  • 基于golang的簡(jiǎn)單分布式延時(shí)隊(duì)列服務(wù)的實(shí)現(xiàn)

    基于golang的簡(jiǎn)單分布式延時(shí)隊(duì)列服務(wù)的實(shí)現(xiàn)

    這篇文章主要介紹了基于golang的簡(jiǎn)單分布式延時(shí)隊(duì)列服務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Golang如何使用go.mod配置加載本地模塊

    Golang如何使用go.mod配置加載本地模塊

    這篇文章主要介紹了Golang如何使用go.mod配置加載本地模塊問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解Golang如何在編譯時(shí)注入版本信息

    詳解Golang如何在編譯時(shí)注入版本信息

    這篇文章主要為大家詳細(xì)介紹了Golang如何在編譯時(shí)實(shí)現(xiàn)注入版本信息,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-06-06
  • golang實(shí)現(xiàn)可中斷的流式下載功能

    golang實(shí)現(xiàn)可中斷的流式下載功能

    這篇文章主要給大家介紹了golang實(shí)現(xiàn)可中斷的流式下載,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Air實(shí)現(xiàn)Go程序?qū)崟r(shí)熱重載使用過(guò)程解析示例

    Air實(shí)現(xiàn)Go程序?qū)崟r(shí)熱重載使用過(guò)程解析示例

    這篇文章主要為大家介紹了Air實(shí)現(xiàn)Go程序?qū)崟r(shí)熱重載使用過(guò)程解析示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • golang跳轉(zhuǎn)語(yǔ)句goto,break,continue的使用及區(qū)別說(shuō)明

    golang跳轉(zhuǎn)語(yǔ)句goto,break,continue的使用及區(qū)別說(shuō)明

    這篇文章主要介紹了golang跳轉(zhuǎn)語(yǔ)句goto,break,continue的使用及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論