利用匿名函数重构作用域
以便 defer 能在合适时机执行
// 错误的例子
func example() {
var m sync.Mutex
for i := 0; i < 5; i++ {
m.Lock()
defer m.Unlock()
println(i)
}
}
这地方有个问题,example 函数是一个加锁操作。m.Unlock()
只有在 example 函数结束的时候才执行,那么每次循环实际上是执行m.Lock()
语句,这个时候解锁操作会被延迟到函数结束。
很显然这个逻辑并不是我们想要的,我们当时写的意思是加锁,defer 为了保证锁会被释放,defer 就是语句后面就算出错也会执行解锁。
显然现在逻辑出错了,解锁被延长了。
很显然,它会认为程序死锁,为什么死锁,是因为你不停的加锁,解锁没有执行。
怎么重构呢?最简单的做法用匿名函数func(){}
把for循环里面逻辑包起来,因为这个时候 defer 是在匿名函数执行完执行,所以你每次循环都可以保证加锁解锁都可以被执行。
func example() {
var m sync.Mutex
for i := 0; i < 5; i++ {
func(){
m.Lock()
defer m.Unlock()
println(i)
}()
}
}
所以利用匿名函数缩小作用域,因为不用