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

go goroutine 怎樣進行錯誤處理

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

前言

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

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

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

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

通過錯誤日志記錄

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

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

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

利用 channel 傳輸

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

第二種方法:利用 channel 來傳輸多個 goroutine 中的 errors:

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

 var wg sync.WaitGroup
 wg.Add(2)
 go func() {
  //... 業(yè)務邏輯
  wg.Done()
 }()
 go func() {
  //... 業(yè)務邏輯
  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("出錯啦。。我是錯誤信息")
}

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

使用 sync/errgroup

第三種方法,就是使用官方提供的 golang.org/x/sync/errgroup 標準庫:

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

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

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
}

每啟動一個新的 goroutine 都直接使用 Group.Go 方法,在等待和錯誤處理上使用 Group.Wait 方法。

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

總結(jié)

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

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

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

相關(guān)文章

  • 使用Go語言進行安卓開發(fā)的詳細教程

    使用Go語言進行安卓開發(fā)的詳細教程

    本文將介紹如何使用Go語言進行安卓開發(fā),我們將探討使用Go語言進行安卓開發(fā)的優(yōu)點、準備工作、基本概念和示例代碼,通過本文的學習,你將了解如何使用Go語言構(gòu)建高效的安卓應用程序,需要的朋友可以參考下
    2023-11-11
  • go語言單例模式(Singleton)實例分析

    go語言單例模式(Singleton)實例分析

    這篇文章主要介紹了go語言單例模式(Singleton),實例分析了單例模式的原理與Go語言的實現(xiàn)技巧,需要的朋友可以參考下
    2015-03-03
  • Go?gRPC進階教程gRPC轉(zhuǎn)換HTTP

    Go?gRPC進階教程gRPC轉(zhuǎn)換HTTP

    這篇文章主要為大家介紹了Go?gRPC進階教程gRPC轉(zhuǎn)換HTTP教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 一文詳解Golang中字符串的常見錯誤

    一文詳解Golang中字符串的常見錯誤

    這篇文章主要來和大家深入討論一下Golang?中的字符串,并查看一些不同的場景,以避免常見錯誤,對大家掌握golang有一定的幫助,需要的可以了解下
    2023-10-10
  • 一文帶你了解Go語言中函數(shù)設(shè)計的實踐示例

    一文帶你了解Go語言中函數(shù)設(shè)計的實踐示例

    良好設(shè)計的函數(shù)具有清晰的職責和邏輯結(jié)構(gòu),提供準確的命名和適當?shù)膮?shù)控制,下面我們將一一描述函數(shù)設(shè)計時能夠遵循的最佳實踐,希望對大家有所幫助
    2023-06-06
  • golang中sync.Map并發(fā)創(chuàng)建、讀取問題實戰(zhàn)記錄

    golang中sync.Map并發(fā)創(chuàng)建、讀取問題實戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于golang中sync.Map并發(fā)創(chuàng)建、讀取問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • 解決go mod私有倉庫拉取的問題

    解決go mod私有倉庫拉取的問題

    這篇文章主要介紹了解決go mod私有倉庫拉取的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang中Delve版本太低無法Debug的問題

    Golang中Delve版本太低無法Debug的問題

    這篇文章主要介紹了Golang中Delve版本太低無法Debug的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 學習GO編程必備知識匯總

    學習GO編程必備知識匯總

    這篇文章主要介紹了學習GO編程必備知識匯總的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • Go語言操作etcd的示例詳解

    Go語言操作etcd的示例詳解

    etcd是使用Go語言開發(fā)的一個開源的、高可用的分布式key—value存儲系統(tǒng),可以用于配置共享和服務的注冊和發(fā)現(xiàn),下面我們就來看看Go語言是如何操作etcd的吧
    2024-03-03

最新評論

获嘉县| 搜索| 黑山县| 赣榆县| 稷山县| 香河县| 乌兰县| 双流县| 贡嘎县| 康保县| 石棉县| 汨罗市| 庆阳市| 迁西县| 闵行区| 兰溪市| 廉江市| 德阳市| 七台河市| 临桂县| 苍溪县| 股票| 东城区| 耒阳市| 正镶白旗| 自治县| 文山县| 武汉市| 天长市| 大渡口区| 当涂县| 汝南县| 庄河市| 苍南县| 墨竹工卡县| 孝昌县| 图们市| 开鲁县| 赤水市| 宜阳县| 荃湾区|