指針類型T 直接調(diào)用
defer t.m()
值類型 使用
defer func() {
t.m()
}
這樣操作的目的是將參數(shù)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并沒有被擴(kuò)容羽莺,cap還是2
如果defer改成使用匿名函數(shù)
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 得到了我們期望的結(jié)果