自己记录。
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。