package main
import (
"fmt"
"time"
)
//goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。
func sayhello() {
for i := 0; i < 10; i++ {
time.Sleep(time.Second)
fmt.Println("say hello")
}
}
func test() {
//这里可以使用错误处理机制defer + recover来解决
defer func() {
//使用匿名函数捕获test抛出的panic
//是一个内建的函数,可以让进入令人恐慌的流程中的 goroutine 恢复过来。
// recover仅在延迟函数中有效。
//在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果。
//如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,
//并且恢复正常的执行。recover只有在defer调⽤的函数中有效。
if err := recover(); err != nil {
fmt.Println("test 发生错误", err)
}
}()
//定义了一个map
var myMap map[int]string
myMap[0] = "golang" //error
//panic: assignment to entry in nil map
}
func main() {
go sayhello()
go test()
for i := 0; i < 10; i++ {
fmt.Println("ok")
time.Sleep(time.Second)
}
}
recover函数的作用:
使用匿名函数捕获test抛出的panic
是一个内建的函数,可以让进入令人恐慌的流程中的 goroutine 恢复过来。
recover仅在延迟函数中有效。
在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果。
如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,
并且恢复正常的执行。recover只有在defer调⽤的函数中有效。