golang defer问题

栏目: Go · 发布时间: 6年前

内容简介:一 函数中间使用defer二 for循环中间使用defer三 判断执行没有err之后,再defer释放资源

一 函数中间使用defer

func returnValues() int {
    var result int 
    defer func() {
       result++
      fmt.Println("defer")
}()
return result
}

func nameReturnValue() (result int) {
    defer func(){
        result++
        fmt.Println("defer")
  }()
return result
}

// 在这里上面的方法输出0,下面的方法输出1,因为上面使用的匿名返回值,下面使用的命名返回值
// defer的执行逻辑(匿名返回值为例)
1. 将result赋值给返回值,相当于 go 自动创建一个返回值returnValue,然后将result赋值给returnValue
2. 检查defer,
3. 返回刚刚创建的returnValue

再来看几个demo

func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}

func f2() (r int) {
    t := 5
    defer func() {
        t = t + 5
    }()
    return t
}

func f3() (r int) {
    defer func(r int) {
        r = r + 5
    }(r)
    return 1
}

func f4() (r int) {
    defer func() {
        r = r + 5
    }()
    return 1
}
// 这里最后的结果是1,5, 1, 6
// f()相当于
func f() (result int) {
        var result = 0
       func() {
        result++   // 1
    }()
    return 
}
// f2()相当于
func f2() (r int) {
    t := 5
        r = t
    func() {
        t = t + 5
    }()
    return
}
r已经赋值无论如何变更t,r的值都不会再次发生改变

// f3()相当于
func f() (r int) {
     r = 1  //给返回值赋值
     func(r int) {        //这里改的r是传值传进去的r,不会改变要返回的那个r值
          r = r + 5
     }(r)
     return        //空的return
}

// f4()相当于
func f4() (r int) {
      var r = 1
      func() {
        r = r + 5   // 6
    }()
    return 
}

二 for循环中间使用defer

func deferInLoops(){
    for i:=0;i<100;i++{
        f, _:= os.Open("xxx")
        defer f.Close()
  }
}
// 这里需要注意defer的执行是需要额外的开销的,对其后需要的参数进行内存拷贝,还需要对defer结构进行压栈出栈操作

三 判断执行没有err之后,再defer释放资源

resp, err := http.Get(url)
// 先判断操作是否成功
if err != nil {
    return err
}
// 如果操作成功,再进行Close操作
defer resp.Body.Close()

四 调用os.Exit的时候defer不会被执行

func deferExit() {
    defer func() {
        fmt.Println("defer")
  }()
os.Exit(0)
}
// 这种情况defer不会被执行

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

信息检索导论

信息检索导论

Christopher D.Manning、Hinrich Schütze、Prabhakar Raghavan / 王斌 / 人民邮电出版社 / 201008 / 69.00元

封面图片为英国伯明翰塞尔福瑞吉百货大楼,其极具线条感的轮廓外型优美,犹如水波的流动。其外表悬挂了1.5万个铝碟,创造出一种极具现代气息的纹理装饰效果,有如夜空下水流的波光粼粼,闪烁于月光之下,使建筑的商业氛围表现到极致。设计该建筑的英国“未来系统建筑事物所”,将商场内部围合成一个顶部采光的中庭,配以交叉的自动扶梯,使购物环境呈现出一种凝聚的向心力和商业广告的展示效应。作为英国第二商业城市伯明翰的建......一起来看看 《信息检索导论》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码