Go团队在实验仓库中添加了一个名为sync.errgroup的新软件包。 sync.ErrGroup再sync.WaitGroup功能的基础上,增加了错误传递,以及在发生不可恢复的错误时取消整个goroutine集合,或者等待超时

其中包含的函数如下:

func WithContext(ctx context.Context) (*Group, context.Context)

Go()方法不仅允许你传一个匿名的函数,而且还能捕获错误信息,你只要像这样返回一个错误 return err,这使开发者使用goroutines时开发效率显著提高
func (g *Group) Go(f func() error)

func (g *Group) Wait() error

示例1(代码中已有详细的注释):

package main
import ("fmt""golang.org/x/sync/errgroup""errors"
)
func main() {group := new(errgroup.Group)nums := []int{-1, 0, 1}for _, num := range nums {tempNum := num // 子协程中若直接访问num,则可能是同一个变量,所以要用临时变量// 子协程group.Go(func() error {if tempNum < 0 {return  errors.New("tempNum < 0 !!!")}fmt.Println("tempNum:",tempNum)return nil})}// 捕获errif err := group.Wait(); err != nil {fmt.Println("Get errors: ", err)}else {fmt.Println("Get all num successfully!")}
}

执行结果如下图(正常捕获到了err):

示例2(代码中已有详细的注释):

package main
import ("fmt""time"xContext "golang.org/x/net/context""golang.org/x/sync/errgroup"
)
func main() {ctx, cancel := xContext.WithCancel(xContext.Background())group, errCtx := errgroup.WithContext(ctx)for index := 0; index < 3; index++ {indexTemp := index // 子协程中若直接访问index,则可能是同一个变量,所以要用临时变量// 新建子协程group.Go(func() error {fmt.Printf("indexTemp=%d \n", indexTemp)if indexTemp == 0 {fmt.Println("indexTemp == 0 start ")fmt.Println("indexTemp == 0 end")} else if indexTemp == 1 {fmt.Println("indexTemp == 1 start")//这里一般都是某个协程发生异常之后,调用cancel()//这样别的协程就可以通过errCtx获取到err信息,以便决定是否需要取消后续操作cancel()fmt.Println("indexTemp == 1 err ")} else if indexTemp == 2 {fmt.Println("indexTemp == 2 begin")// 休眠1秒,用于捕获子协程2的出错time.Sleep(1 * time.Second)//检查 其他协程已经发生错误,如果已经发生异常,则不再执行下面的代码err := CheckGoroutineErr(errCtx)if err != nil {return err}fmt.Println("indexTemp == 2 end ")}return nil})}// 捕获errerr := group.Wait()if err == nil {fmt.Println("都完成了")} else {fmt.Printf("get error:%v", err)}
}//校验是否有协程已发生错误
func CheckGoroutineErr(errContext xContext.Context) error {select {case <-errContext.Done():return errContext.Err()default:return nil}
}

执行结果如下图(捕获到了cancel):

go errgroup 用法示例相关推荐

  1. Go基础系列:双层channel用法示例

    Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 双层通道的解释见Go的双层通道 ...

  2. objdump反汇编用法示例

    objdump反汇编用法示例 原文:http://blog.csdn.net/zoomdy/article/details/50563680 -d:将代码段反汇编 -S:将代码段反汇编的同时,将反汇编 ...

  3. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  4. php指定长度 分割整形,php指定长度分割字符串str_split函数用法示例

    本文实例讲述了php指定长度分割字符串str_split函数用法.分享给大家供大家参考,具体如下: 示例1:$str = 'abcdefgh'; $arr = str_split($str,2); 运 ...

  5. Linux find 用法示例

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  6. mysql教程or怎么用_MySQL中or语句用法示例

    1.mysql中or语法的使用,在mysql语法中or使用注意点. 项目遇到坑,遍历发放奖励数据查询错误!!! $sql = 'SELECT * FROM `vvt_spread_doubleegg_ ...

  7. html兄弟选择器怎么用,CSS的相邻兄弟选择器用法示例讲解

    对于有相同父元素的相邻HTML元素查找便可以使用CSS的相邻兄弟选择器,这里我们就来看一下CSS的相邻兄弟选择器用法简单讲解: 可选择紧接在另一个元素后的元素,且二者有相同的父级元素 下面代码中,it ...

  8. boost::format模块format的基本用法示例

    boost::format模块format的基本用法示例 实现功能 C++实现代码 实现功能 boost::format模块format的基本用法示例 C++实现代码 #include "b ...

  9. boost::format模块format的高级用法示例

    boost::format模块format的高级用法示例 实现功能 C++实现代码 实现功能 boost::format模块format的高级用法示例 C++实现代码 #include <ios ...

最新文章

  1. Codeforces Gym 100269G Garage 数学
  2. Linux 输入输出重定向 2>/dev/null和>/dev/null 2>1和2>1>/dev/nul
  3. 全局搜索关键字命令_linux全局搜索命令有哪些?
  4. 金九银十加薪季,测试题预热一波。
  5. 不走寻常嵌入式开发路
  6. buuct 假如给我三天光明 misc_【习作园地】假如给我三天光明读后感
  7. python开发软件有哪些?Python编程软件
  8. 分享win10常用图标ico_png_html素材
  9. VB编程:GetSetting控制软件试用期-56
  10. mysql触发器trigger实例详解
  11. YYLabel 自动布局 不换行 numberOfLines无效
  12. VMware硬盘不足踩坑记录:扩容分区 + 删除.cache文件夹
  13. 云专网和云专线的区别_云专线网络接入解决方案
  14. SDRAM内存的接口和设计方法(并行输送接口)
  15. Python装逼指南——五行代码实现批量抠图!
  16. ansible D2
  17. 计算机网络基础结构;对等网的特点;网络的扩大;网络的拓扑结构;
  18. 涨知识!关于外贸单证知识,什么是单证一致!
  19. doraemon的python 从计算机基础到面向对象的笔记(加面试题)
  20. 华为应用市场推出独家年终游戏节活动,包括12款最热门手游

热门文章

  1. WinForm 入口Main方法
  2. 网站安全之ASP程序加密解密方法全面解析
  3. HDU- 2973 YAPTCHA(威尔逊定理)
  4. # 字符串从右往左查找_python数据类型及字符串(2)
  5. plpythonu_postgresql plpythonu例子
  6. UVA 725 Division(除法)
  7. OD+IDA6.1破解HideWizardv9.29(无忧隐藏)
  8. cocos2d-x游戏开发(七)对象释放时机
  9. 手把手教你玩转SOCKET模型:重叠I/O篇
  10. MAP文件和调试(VC)(从崩溃地址找出错源码位置)