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 得到了我们期望的结果

上一篇下一篇

猜你喜欢

热点阅读