defer 的基本使用 | 学习笔记

简介: 快速学习 defer 的基本使用

开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: defer 的基本使用】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/625/detail/9609


defer 的基本使用

基本内容

一、 为什么需要 defer

二、 快速入门案例

 

一、为什么需要 defer

在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等),为了在函数执行完毕后,及时的释放资源,Go 的设计者提供 defer (延时机制)。打开一个数据库的链接,文件句柄、锁都是资源。只要加上 defer,函数在执行完毕后, defer 后面的语句也会执行。

 

二、快速入门案例

1、 代码示例:

package main

import (

"fmt"

)

func sum(n1 int, n2 int) int {

//当执行到 defer 时,暂时不执行,会将 defer 后面的语句压入到独立的栈( defer栈)

//当函数执行完毕后,再从 defer 栈,按照先入后出的方式出栈,执行

defer fmt.Println( "ok1 n1=", n1) //defer 3. ok1 n1=10

defer fmt.Println( "ok2 n2=", n2) //defer 2.ok2 n2=20

res := n1 + n2 // res = 30

fmt.Print1n( "ok3 res=", res) // 1.ok3 res= 30

return res

}

func main(){

res := sum( 10,20)

fmt.Println( "res=", res) // 4. res=30

}

2、 执行后,输出的结果:

ok3 res=30

ok2 n2=20

ok1 n1=10

res =30

image.png

3、 代码解析:

新建一个文件夹 deferdemo,在文件夹中新建一个文件 main.go,import 一个包叫 fmt。主函数调用 sum(10,20)返回一个 int,将 n1+n2 后给 res 变量,输出一个 ok。res 等于这个值,再把 res 返回回来。接收返回来这个值 res : = sum( 10,20)。判断输出的顺序,当执行到 defer 时,会将 defer 后面的语句压入到独立的栈中,暂时不执行,当函数执行完毕后,再从 defer 栈按照先入后出的方式出栈执行,先进去后执行。res=30, 先输出的是 ok3 res=30。再执行 return,return 执行过后,sum 执行完毕了。ok1 n1= 先入栈后出,出栈的时候先把栈顶的弹出来,再执行 ok2,再 ok1,当 defer 栈全部都执行完毕后,最后执行 res=30。defer 在这里的起的作用是可以把一些 sum 函数完毕过后要执行的语句先把它压入到 defer 栈中,等到这个函数执行过后再依次的执行。在资源进行释放的时候,会经常使用到这个。第一执行 ok3,再执行 ok2,再执行 ok1,最后执行 res,输出的结果一致。

相关文章
|
消息中间件 弹性计算 Java
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
|
存储 分布式计算 数据挖掘
数据架构 ODPS 是什么?
数据架构 ODPS 是什么?
3255 7
|
Java Go
Golang深入浅出之-Goroutine泄漏检测与避免:pprof与debug包
【5月更文挑战第1天】本文介绍了Go语言中goroutine泄漏的问题及其影响,列举了忘记关闭通道、无限循环和依赖外部条件等常见泄漏原因。通过引入`net/http/pprof`和`runtime/debug`包,可以检测和避免goroutine泄漏。使用pprof的HTTP服务器查看goroutine堆栈,利用`debug`包的`SetGCPercent`和`FreeOSMemory`函数管理内存。实践中,应使用`sync.WaitGroup`、避免无限循环和及时关闭通道来防止泄漏。理解这些工具和策略对维护Go程序的稳定性至关重要。
383 4
|
消息中间件 存储 Cloud Native
云原生中间件RocketMQ-消费者消费模式之广播模式
云原生中间件RocketMQ-消费者消费模式之广播模式
1663 102
|
网络协议 网络安全 数据安全/隐私保护
【最详细】Wireshark使用教程(一)
【最详细】Wireshark使用教程(一)
|
存储 SQL 关系型数据库
一篇文章带你玩转PostGIS空间数据库 1
一篇文章带你玩转PostGIS空间数据库
|
SQL 数据库
GORM—查
GORM—查
180 0
No.12 gin框架中的binding究竟是干嘛的?(一)
No.12 gin框架中的binding究竟是干嘛的?
246 0
sentence_transformers模型无法直接下载的解决方案
本文介绍使用sentence_transformers包(官网:https://huggingface.co/sentence-transformers)时,直接调用模型名称无法下载模型的解决方案。 其实跟transformers包差不多,都是把文件下载到本地然后直接使用路径加载模型。