Golang——defer

本文深入探讨了Go语言中defer关键字的使用场景与规则,通过具体的代码示例解释了defer如何在函数结束前执行资源释放操作,如关闭文件描述符或数据库连接等。文章还解析了defer在不同情况下的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.defer用于资源的释放
用于在作用域结束之后执行函数的关键字,在当前函数或者方法返回之前调用一些用于收尾的函数,例如关闭文件描述符、关闭数据库连接以及解锁资源。
2. leetcode:79
https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.4.html
规则:
给函数返回值赋值
调用defer函数
空的return

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

func f() (result int) {
     result = 0  
     func() { //defer被插入到return之前执行,也就是赋返回值和ret指令之间
         result++
     }()
     return
}
结果是1
func f() (r int) {
     t := 5
     defer func() {
       t = t + 5
     }()
     return t
}

func f() (r int) {
     t := 5
     r = t  //给返回值赋值
     func() {//defer被插入到赋值与返回之间执行,此例子返回值r没被修改过
         t = t + 5
     }
     return        //空的return指令
}
结果是5
func f() (r int) {
    defer func(r int) {
          r = r + 5
    }(r)
    return 1
}

func f() (r int) {
     r = 1  //给返回值赋值
     func(r int) {//这里改的r是传值传进去的r,不会改变要返回的那个r值
          r = r + 5
     }(r)
     return        //空的return
}
结果是1
03-08
### Go语言简介 Go语言起源于2007年,并于2009年正式对外发布[^1]。这是一门相对较新的编程语言,旨在提供类似于Python等动态语言的快速开发体验以及C/C++这类编译型语言的安全性和高性能。 ### 学习路径与资源推荐 #### 官方文档 官方提供的资料是最权威的学习材料之一。通过阅读这些文档,可以获得关于语法结构、标准库等方面的详尽说明。 #### 在线课程平台 许多在线教育网站提供了针对不同层次学习者的Go语言教学视频和练习项目,适合希望通过互动方式掌握新技能的人群。 #### 社区论坛和支持小组 参与社区讨论能够帮助解决遇到的具体问题并与其他开发者分享经验心得。GitHub Issues页面也是寻找开源项目贡献机会的好去处。 #### 实践练习 动手编写简单的命令行工具或者Web服务器来加深理解。实践是检验真理的标准,在实际编码过程中更容易发现自己的不足之处进而加以改进。 ```go // 示例:创建一个基本HTTP服务器 package main import ( "fmt" "net/http" ) func helloWorld(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w,"Hello World!") } func main(){ http.HandleFunc("/",helloWorld) err := http.ListenAndServe(":8080",nil) if err != nil { panic(err.Error()) } } ``` ### 初始化过程解析 当涉及到全局变量定义时,其赋值语句会在`init()`之前被执行;而`init()`又是在`main()`启动前完成调用。因此上述例子中输出顺序将是:“test函数被调用执行”,接着是“init函数被调用执行”,最后才是“main函数被调用执行”。值得注意的是,如果存在多个同级包下的`init()`方法,则它们之间的具体执行次序未作明确规定[^2]。 ### 关键特性介绍 延迟调用(`defer`)允许程序员指定一段代码在其所在作用域结束之际才得以真正运行,常用于确保文件关闭或其他必要的清理工作得到妥善处理[^3]。 #### `init` 函数的作用范围及注意事项 - 只能在声明此功能所在的源码单元内部有效; - 不接受任何形式参数也不返回任何结果给外部环境; - 对于整个应用程序而言必不可少的部分——即入口点所在的`main`包下必须实现至少一个这样的成员; - 尽管可以在单个包里放置多份副本,但从长远来看不利于维护管理,故应尽量保持单一化原则[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值