Go函数-延迟调用(三)

在go语言里,defer可是实现延迟函数调用。语句defer向当前函数注册稍后执行的函数调用。这些调用被称做延迟调用,因为它们知道当前函数执行结束前才被执行,常用于资源释放、解除锁定,以及错误处理等操作。

func main() {
    f, err := os.Open("./main.go")
    if err != nil {
        log.Fatal(err)
    }

    defer f.Close()    //仅注册,直到main退出前才执行

    println("hello world")
}

延迟调用注册的是调用,必须提供执行所需参数(哪怕为空)。参数值在注册时被复制并缓存起来。如对状态敏感,可改用指针。

func main() {
    x, y := 1, 2

    defer func(a int) {
        println("defer x, y =",a, y)  //y为闭包引用
    }(x)                    //注册时复制调用参数

    x += 100                    //对x的修改不会影响延迟调用
    y += 200
    println(x, y)
}

输出:

101 202
defer x, y = 1 202
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • [TOC] golang语言defer特性详解 defer语句是go语言提供的一种用于注册延迟调用的机制,它可以让...
    木鸟飞鱼阅读 4,213评论 3 4
  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,720评论 1 19
  • 最近要做数据血缘,发现了Hive源码的一个类可以用来分析Hive表的关系:org.apache.hadoop.hi...
    duval阅读 6,320评论 8 3
  • 光阴似箭,岁月如流。时间过得真快,一转眼21天特种兵训练马上就结束。明天是最后一天了。 在这寒冷的冬天,寒风呼呼地...
    懒羊羊_0628阅读 137评论 0 0