go语言写源码学goroutine、channel、panic、recover

自己记录。

package main

import (
	"fmt"
	"sync"
	"time"
)

var wg = sync.WaitGroup{} //计数信号量,跟踪goroutine是否完成
func main() {
	c := make(chan int)
	wg.Add(3)
	go Go(c)//GO,GO,GO
	go func(cha chan int) { //注意chan当形参,需加上int类型
		for i:=0;i<3;i++{
			cha <- i
		}
		close(c)
		wg.Done()
	}(c)
	
	//暂时知道这么一个(延迟下面执行测试panic、recover机制)的方法
	//不然会两个goroutine差不多同时执行,测试不了panic
	time.Sleep(2*time.Second) 

	go func(cha chan int) { //测试panic、recover机制
		defer func() {
			if err:= recover();err != nil{
				fmt.Println("i will back")
				wg.Done() //即使出错也应该将此goroutine的WaitGroup -1
			}
		}()
		panic("走你")
		cha <- 100 //肯定会出错,因为上面先执行的goroutine已经将通道关闭
		wg.Done()
	}(c)
	wg.Wait()
	fmt.Println("HI")
}
func Go(t chan int){
	fmt.Println("GO,GO,GO") //GO,GO,GO
    for a := range t{
    	fmt.Println(a)  //0,1,2
	}
	wg.Done()
}

打印结果为

GO,GO,GO
0
1
2
i will back
HI

打印i will back HI 会延迟2s。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值