美文网首页golang
Go语言学习笔记08.defer

Go语言学习笔记08.defer

作者: 快乐的提千万 | 来源:发表于2019-11-05 16:44 被阅读0次

defer

defer可以说是go的一个很牛逼的功能了,将函数暂存,延时执行。
defer语句只能出现在函数或方法的内部。表明在当前函数执行完了再执行要延时的函数。哪怕当前函数崩了。
defer语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。通过defer机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放。释放资源的defer应该直接跟在请求资源的语句后。
比如,我在当前函数申请了一堆资源,或者加上了锁,然后用defer延时调用一个释放资源、释放锁的函数。保证不会锁死,哪怕当前函数崩了,也不会锁死。

package main //必须

import "fmt"

func main() {
    a := 10
    b := 20

    defer func(a, b int) {
        fmt.Printf("a = %d, b = %d\n", a, b) //a = 10, b = 20
    }(a, b) 

    defer func(a, b int) {
        fmt.Printf("传进来:a = %d, b = %d\n", a, b) //传进来:a = 10, b = 20
        a = 100
        fmt.Printf("改了之后:a = %d, b = %d\n", a, b) //改了之后:a = 100, b = 20
    }(10, 20) //()代表调用此匿名函数, 把参数传递过去,已经先传递参数,只是没有调用

    
    b = 222
    //这里会是还没改的 
    fmt.Printf("外部:a = %d, b = %d\n", a, b) //外部:a = 10, b = 222
    
    //故意挂掉
    result := 100 / 0
    
    /**打印顺序
        外部:a = 10, b = 222
        传进来:a = 10, b = 20
        改了之后:a = 100, b = 20
        a = 10, b = 20
        报错:go:24:16: division by zero
    */
}

通过执行顺序可以看出来,延时的顺序也是栈的顺序。

相关文章

  • Go语言学习笔记08.defer

    defer defer可以说是go的一个很牛逼的功能了,将函数暂存,延时执行。defer语句只能出现在函数或方法的...

  • 笨办法学golang(三)

    这是Go语言学习笔记第三篇。 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 Go语言基本类型主要有布...

  • 笨办法学golang(二)

    这是Go语言学习笔记的第二篇文章。 Go语言学习笔记参考书籍「Go语言编程」、Go官方标准库 前文提要 上篇文章中...

  • 笨办法学golang(四)

    这是Go语言学习笔记的第四篇 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 数组 数组是指一系列同类...

  • Go 语言极速入门

    本系列文章主要是记录《Go 语言实战》和《Google 资深工程师深度讲解 Go 语言》的学习笔记。 Go 语言极...

  • Golang相关电子书

    Golang相关电子书,会不定期更新 Go语言程序设计 Go语言学习笔记.雨痕(详细书签) Go语言·云动力(云计...

  • Go语言学习笔记,持续更新...

    Go 学习笔记 Go语言变量和常量 1. 标识符 2. 关键字 Go语言中有25个关键字 break ...

  • Go并发调度

    本文是《循序渐进Go语言》的第六篇-Go并发调度。本文是学习《Go语言学习笔记》的并发调度一章,然后结合阅读源码的...

  • Golang聚合

    教程 Go Web 编程Go语言圣经(中文版) Tips Golang 学习笔记——交叉编译 & 部署Golang...

  • Go 语言学习技巧和编程思维

    Go 语言学习技巧和编程思维 一、了解 Go 语言 了解 Go 语言背景 学习 Go 语言,首先要了解 Go 语言...

网友评论

    本文标题:Go语言学习笔记08.defer

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