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。

你可能感兴趣的:(go)