美文网首页
go语言 defer 采坑

go语言 defer 采坑

作者: __robin | 来源:发表于2021-04-17 17:32 被阅读0次

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

    相关文章

      网友评论

          本文标题:go语言 defer 采坑

          本文链接:https://www.haomeiwen.com/subject/kzkmcltx.html