`
stephen830
  • 浏览: 3011506 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

defer 延迟函数

 
阅读更多

defer 延迟函数

defer 又是一个创新,它的作用是:延迟执行,在声明时不会立即执行,而是在函数return后时按照后进先出的原则依次执行每一个defer。这样带来的好处 是,能确保我们定义的函数能百分之百能够被执行到,这样就能做很多我们想做的事,如释放资源,清理数据,记录日志等

这里我们重点来说明下defer的执行顺序.

 

func deferFunc() int {
    index := 0

    fc := func() {

        fmt.Println(index, "匿名函数1")
        index++

        defer func() {
            fmt.Println(index, "匿名函数1-1")
            index++
        }()
    }

    defer func() {
        fmt.Println(index, "匿名函数2")
        index++
    }()

    defer fc()

    return func() int {
        fmt.Println(index, "匿名函数3")
        index++
        return index
    }()
}

func main() {
    deferFunc()
}

 

这里输出结果如下,

0 匿名函数3
1 匿名函数1
2 匿名函数1-1
3 匿名函数2

有如下结论:

  • defer 是在执行完return 后执行
  • defer 后进先执行

另外,我们常使用defer去关闭IO,在正常打开文件后,就立刻声明一个defer,这样就不会忘记关闭文件,也能保证在出现异常等不可预料的情况下也能关闭文件。而不像其他语言:try-catch 或者 using() 方式进行处理。

file , err :=os.Open(file)
if err != nil {
    return err
}
defer file.Close() 
//dosomething with file

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    GO语言延迟函数defer用法分析

    本文实例讲述了GO语言延迟函数defer用法。分享给大家供大家参考。具体分析如下: defer 在声明时不会立即执行,而是在函数 return 后,再按照 FILO (先进后出)的原则依次执行每一个 defer,一般用于异常处理、释放...

    Go语言中的延迟函数defer示例详解

    Go 语言中延迟函数 defer 充当着 try…catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer、return、返回值、panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘...

    Go使用defer函数要注意的几个点

    在Go语言中,`defer`关键字是一个非常重要的特性,它用于延迟函数的执行,直到包含它的函数返回。`defer`通常用于资源释放、错误处理和简化代码结构。以下是对`defer`函数使用时需要注意的几点: 1. **执行顺序**:...

    go语言中匿名返回值和命名返回值对defer的影响

    在Go语言中,`defer`关键字用于延迟函数的执行,直到包含它的函数返回。这个特性在清理资源、确保锁的释放等方面非常有用。然而,`defer`的行为在处理匿名返回值和命名返回值的函数中有所不同,这可能导致不预期的...

    Golang学习笔记之延迟函数(defer)的使用小结

    在Golang中,`defer`是一个非常独特且实用的关键字,它主要用于在函数退出前执行特定的操作,如释放资源、清理工作或者进行错误处理。本文将深入探讨`defer`的使用方式及其应用场景。 首先,`defer`声明的函数并...

    前端开源库-defer-promise

    - **创建延迟承诺**: 使用 `defer()` 函数可以创建一个新的延迟承诺对象,它返回一个Promise实例,同时提供 `resolve` 和 `reject` 方法来改变Promise的状态。 ```javascript const { defer } = require('defer-...

    总结Go语言中defer的使用和注意要点

    这里`function_name`是要延迟调用的函数名称,`parameters`是传递给该函数的参数列表。 ##### 示例 考虑以下示例,它展示了如何使用`defer`来确保文件关闭: ```go package main import ( "fmt" "os" ) func ...

    掌握Go语言的异常处理:defer、panic和recover的协同艺术

    `defer`关键字在Go语言中用于延迟函数的执行。当一个函数执行完毕时,所有使用`defer`声明的函数将按照它们声明的逆序执行。这种方式非常适合用于资源清理,比如关闭文件或数据库连接等。此外,`defer`也可以用来...

    go代码-defer_defer.go

    `defer` 关键字用于定义一个延迟调用的函数,这个函数会在当前函数返回之前执行。其基本语法是: ```go defer functionCall() ``` 这里的`functionCall`可以是任何函数调用表达式。当`defer`语句被执行时,它不会...

    GO语言Defer用法实例分析

    在Go语言中,defer关键字用于延迟函数的执行,直到包含它的函数结束。这一功能在需要清理资源,比如关闭文件、解锁互斥量等场景下非常有用。本文将对Go语言的defer用法进行详细分析,并通过实例来展示其实际使用方法...

    深入理解javascript中defer的作用

    3. **全局变量和函数的依赖**:`defer`脚本中的全局变量和函数不应被页面中其他立即执行的脚本所依赖,因为它们会在DOM加载完成后才执行。 `defer`属性的一个显著优势是性能优化。它允许脚本在后台下载,同时浏览器...

    go代码-defer_impact.go

    这个函数调用会被延迟到当前函数返回时执行。这在清理资源、确保文件关闭、解锁或者在多个函数调用之间保持一致的上下文等方面非常有用。 1. **执行顺序**:当有多个`defer`语句时,它们会按照“后进先出”(LIFO,...

    4. 函数1

    匿名函数常用于goroutine、延迟函数和在函数内部定义一次性使用的函数。`defer`关键字用于确保资源的释放,例如文件的关闭。 8. **`defer`语句**: - `defer`后的函数调用会在函数返回之前执行,这有助于保持代码...

    golang中defer的关键特性示例详解

    大家都知道golang的defer关键字,它可以在函数返回前执行一些操作,最常用的就是打开一个资源(例如一个文件、数据库连接等)时就用defer延迟关闭改资源,以免引起内存泄漏。本文主要给大家介绍了关于golang中defer...

    go代码-defer_parameters.go

    - `defer` 关键字用于延迟函数的调用,直到包含它的函数返回。这在需要确保某些操作(如关闭文件、解锁资源等)在函数结束时一定会被执行的情况下非常有用。 - 声明的`defer`函数会被压入一个栈中,当包含`defer`...

    go panic时如何让函数返回数据?

    `defer` 语句用于延迟函数的执行,直到包含它的函数返回。`defer` 函数的执行顺序是先进后出(LIFO),也就是说,最后定义的 `defer` 函数最先执行。这在处理资源清理或错误恢复时非常有用。 在原始的问题中,我们...

    Go语言defer语句的三种机制整理

    Go语言的`defer`语句是其特性之一,它允许开发者在函数的开始部分定义一个延迟执行的函数调用,通常用于资源清理、错误处理等场景。本文将深入探讨Go语言`defer`语句的三种机制,分别是:堆上分配、栈上分配和开放...

Global site tag (gtag.js) - Google Analytics