go语言 defer 采坑
2021-04-17 本文已影响0人
__robin
指针类型T 直接调用
defer t.m()
值类型 使用
defer func() {
t.m()
}
这样操作的目的是将参数t
捕获,形成闭包,编译器会将t
被分配到堆上,栈上只保留其地址,这样defer中操作的才是真正的t
而不是其拷贝。
例子
type Person struct {
Name string
ID int
}
var pool = &sync.Pool{
New: func() interface{} {
return make([]*Person, 0,2)
},
}
func main() {
foo()
pl := pool.Get().([]*Person)
fmt.Println(pl)
print(pl)
}
func foo() {
pl := pool.Get().([]*Person)
defer pool.Put(pl[:0])
//defer func() {
// pool.Put(pl[:0])
//}()
pl = append(pl, &Person{"d", 4},&Person{"a", 3},&Person{"b", 2})
}
输出
[]
[0/2]0xc000010240
可以看出pl并没有被扩容,cap还是2
如果defer改成使用匿名函数
func foo() {
pl := pool.Get().([]*Person)
//defer pool.Put(pl[:0])
defer func() {
pool.Put(pl[:0])
}()
pl = append(pl, &Person{"d", 4}, &Person{"a", 3}, &Person{"b", 2})
}
输出
[]
[0/4]0xc000054020
Good Job 得到了我们期望的结果