defer
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var mt sync.Mutex
for i := 0; i < 10; i++ {
go func(index int) {
for j := 0; j < 3; j++ {
mt.Lock()
defer func() {
mt.Unlock()
fmt.Println("release done")
}()
fmt.Printf("%d_%d\n",index,j)
}
}(i)
}
time.Sleep(time.Second * time.Duration(1))
fmt.Println("finish!")
}
执行后发现协成一直卡在了defer释放的地方,而把defer mt.Unlock()直接放在打印后,采用手动释放的方式就没问题。
直接原因:
1. defer的作用域是整个函数,不是某个for循环之类的局部变量;
2. defer是堆栈,后进先出
panic、recover
package main
import "fmt"
func main() {
defer_call()
}
func defer_call() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err) //此处的err其实是panic传入的值
}
}()
defer func() { fmt.Println("打印前") }()
defer func() { fmt.Println("打印中") }()
defer func() { fmt.Println("打印后") }()
panic("触发异常") //需要使用recover进行捕获
}
执行结果:
触发异常 打印后 打印中 打印前