美文网首页
Go语言中的defer(延迟执行)

Go语言中的defer(延迟执行)

作者: louyang | 来源:发表于2021-06-17 16:15 被阅读0次

正常的函数调用是这样的:

package main

import (
    "log"
)

func main() {
    log.Print("1");
    log.Print("2");
    log.Print("3");
}

屏幕输出:

2021/06/17 10:51:29 1
2021/06/17 10:51:29 2
2021/06/17 10:51:29 3

被延迟的函数调用时这样的:

package main

import (
    "log"
)

func main() {
    defer log.Print("1");  // delay exection at end of main(), first in last out
    defer log.Print("2");  // delay exection at end of main(), first in last out
    log.Print("3");
}

屏幕输出:

2021/06/17 10:56:04 3
2021/06/17 10:56:04 2
2021/06/17 10:56:04 1

所以defer是写在函数调用前面,使得当前函数的执行延迟到上一级函数退出的时候。

关于defer,记住两点就够了:

  1. defer使函数调用入堆栈,当上一级函数退出时执行。多个defer按照堆栈规则,先入后出。
  2. defer的函数入参立即生效,例如:
package main

import (
    "log"
)

func main() {
    i := 0
    defer log.Print(i)
    i++
}

输出时0,而不是1。因为defer的函数入参是立即取值的。

````defer```最经典的应用是释放资源,例如:

package main

import (
    "os"
)

func main() {
    f, _ := os.Create("test.txt")
    defer f.Close()

    f.WriteString("Hello World!")

    /* defer f.Close() will be executed here */
}

有了defer的好处是,申请和释放资源的代码可以非常非常的近。

参考

https://www.geeksforgeeks.org/defer-keyword-in-golang/
https://www.digitalocean.com/community/tutorials/understanding-defer-in-go
https://dev.to/luciferchase/what-the-heck-is-defer-in-golang-35imko

相关文章

  • Go语言中的defer(延迟执行)

    正常的函数调用是这样的: 屏幕输出: 被延迟的函数调用时这样的: 屏幕输出: 所以defer是写在函数调用前面,使...

  • 深入理解 Go-Defer的机制

    defer 的作用和执行时机 go 的 defer 语句是用来延迟执行函数的,而且延迟发生在调用函数 return...

  • go语言defer的用法

    用法介绍: defer是Go语言中的延迟执行语句,用来添加函数结束时执行的代码,常用于释放某些已分配的资源、关闭数...

  • 第15章-defer语句

    defer 1.1 延迟是什么? 即延迟(defer)语句,延迟语句被用于执行一个函数调用,在这个函数之前,延迟语...

  • Golang中defer用法

    Go语言中的defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按d...

  • Go函数-延迟调用(三)

    在go语言里,defer可是实现延迟函数调用。语句defer向当前函数注册稍后执行的函数调用。这些调用被称做延迟调...

  • defer go

    Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语...

  • defer

    Go 语言的 defer 会在当前函数或者方法(不是main)返回之前执行函数。由于 defer 的延迟特性,de...

  • Golang学习笔记-defer关键字学习

    defer学习 很多现代的变成语言中都会有defer关键字,Go语言的defer会在当前函数或是方法返回之前执行传...

  • Go语言中的延迟语句defer

    参考:http://c.biancheng.net/view/61.html 关键点 希望通过下面的关键词,能够实...

网友评论

      本文标题:Go语言中的defer(延迟执行)

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