goroutine的使用时常见错误

goroutine是Golang 的核心之一,在使用时,一般都要配合channel一起使用。

在使用时,经常会遇到一些错误,包括:

  1. 不输出
  2. 输出与希望输出不一致
  3. all goroutines are asleep - deadlock!

对于error1,举个例子

func main() {
for i := 0; i < 3; i++ {
go func() {
fmt.Printf("f1:%d\n", i)
}()
}
}

我们使用go func()创建了三个routine,但是发现没有输出。

原因:

3个routine刚被创建完成,进程就结束了

解决:

我在main进程中设置了res := <-a来等待三个routine分别发信号,只有发完信号,3个routine才能结束

func main() {
a := make(chan int)
for i := 0; i < 3; i++ {
go func() {
a <- i
}()
}
for {
res := <-a
fmt.Printf("f1:%d\n", res)
}
close(a)
}

到目前为止,输出问题解决了,但是此时我们发现error2和error3都出来了

对于error2

到目前为止,我们发现,我们的输出为

f1:3
f1:3
f1:3

并非我们希望输出的f1:0 f1:1 f1:2

原因:

3个routine先被创建了,创建完后,执行routine内的内容,即读取i,然而此时i已经等于3,因此,读取时全部为3

解决:

变成go func(j int) {}(i),利用闭包函数传参

func main() {
a := make(chan int)
for i := 0; i < 3; i++ {
go func(j int) {
a <- j
}(i)
}
for {
res := <-a
fmt.Printf("f1:%d\n", res)
}
close(a)
}

此时,我们发现已经解决了输出不正确的问题,但是此时all goroutines are asleep - deadlock!还在

对于error3

原因:3个routine都已经执行完毕,但是channel还在等待信号

解决方式:channel的send/receive数量对应即可

func main() {
a := make(chan int)
for i := 0; i < 3; i++ {
go func(j int) {
a <- j
}(i)
}
for i := 0; i < 3; i++ {
res := <-a
fmt.Printf("f1:%d\n", res)
}
close(a)
}

最新文章

  1. Dom学习笔记
  2. phpcms数据库操作
  3. 配置ST3在浏览器中打开
  4. c 字符串常用函数
  5. C#保留小数位数
  6. ASP.NET中如何生成图形验证码
  7. 数据结构与算法分析 3.4&amp;3.5 — 链表的交与并算法
  8. H5投放在朋友圈广告做压力测试
  9. 使用.net 自建短链接(短网址)
  10. win10 uwp 读取文本GBK错误
  11. 求sum=1+111+1111+........+1....111 .
  12. Cocos Creator—优化首页打开速度
  13. Berlekamp_Massey 算法 (BM算法) 学习笔记
  14. 人生苦短,我用python(目录)
  15. hdu 1114Piggy-Bank(完全背包)
  16. k8s单机部署1.11.5
  17. visual studio扩展插件Visual Assist x给代码插入注释模板(转载)
  18. hdu1158 Employment Planning 2016-09-11 15:14 33人阅读 评论(0) 收藏
  19. Eclipse技巧
  20. opencv 启动摄像头 C++

热门文章

  1. Shell流程控制语句while
  2. SpringBoot 使用AOP记录接口访问日志
  3. docker 删除含有指定字符的container
  4. [LeetCode] 293. Flip Game 翻转游戏
  5. ThinkPHP5.1的数据库链接和增删改查
  6. 【VS开发】VS2015没修改源文件也导致重新编译的解决办法
  7. 【神经网络与深度学习】【计算机视觉】YOLO2
  8. tween算法
  9. java方法重写的规定
  10. Ubuntu遇到apt-get update报错:&quot;E: Could not get lock /var/lib/apt/lists/lock&quot;