Go语言现代web开发defer 延迟执行

news/2025/1/15 12:27:29/

The defer statement will delay the execution of a function until the surrounding function is completed. Although execution is postponed, funciton arguments will be evaluated immediately.

defer语句将延迟函数的执行,直到周围的函数完成。虽然执行被延迟,但函数参数将立即求值。

Defer is quite useful in situations when we should execute a specific function call after the execution of the surrounding function. It is often used to close files, streams, or connections to a database because defer will be executed even if the function fails; so, we do not need to handle all situations when something goes wrong, one simple defer statement will take care of it.

当我们应该在执行周围函数之后执行特定的函数调用时,Defer非常有用。它通常用于关闭文件、流或与数据库的连接,因为即使函数失败,也会执行defer;因此,当出现问题时,我们不需要处理所有情况,一个简单的defer语句就可以处理它。

In the following example, the execution of fmt.Print(2) will be postponed until main() function is concluded;

在下面的例子中,fmt.Print(2)的执行将被延迟,直到main()函数结束;

func main(){fmt.Print(1)defer fmt.Print(2)fmt.Print(3)
}

Value 132 will be displayed on the standard output.

标准输出将显示132。

We can have more than one defer statement inside a function. The function call will be pushed onto a stack. The stack can be defined as a collection of elements, where the most recently added element will be removed first. This principle is called LIFO, Last, first out.

在一个函数中可以有多个defer语句。函数调用将被压入堆栈。堆栈可以定义为元素的集合,其中最近添加的元素将首先被删除。这个原则被称为后进先出。

The following code snippet will print 1342 on standard output. The first print will be executed, be second one (under defer) will be pushed onto the stack the third print will be executed, and the fourth one will be pushed onto the stack. Deferred function calls on the stack are presented in next. Since the fourth print is pushed onto the stack last, it will be executed first.

下面的代码片段将在标准输出中打印1342。第一次打印将被执行,第二次打印(在defer下)将被压入堆栈,第三次打印将被执行,第四次打印将被压入堆栈。堆栈上的延迟函数调用在next中给出。由于第四次打印最后被压入堆栈,因此它将首先执行。

func main(){fmt.Print(1)defer fmt.Print(2)fmt.Print(3)defer fmt.Print(4)
}

If defer is declared after return, the function call will not be executed, because defer statement will not be executed, and the function call will not be pushed into the stack. In the following example, first call of the testDefer() function will execute will four calls of the Print() function, and the second call will not execute the fourth one.

如果在return之后声明了defer,函数调用将不会被执行,因为defer语句不会被执行,函数调用也不会被压入堆栈。在下面的示例中,testDefer()函数的第一次调用将执行对Print()函数的四次调用,而第二次调用将不执行第四次调用。

func testDefer(val int){fmt.Print(1)defer fmt.Print(2)fmt.Print(3)if val == 5{return}defer fmt.Print(4)
}func main(){testDefer(3)testDefer(5)
}

Value 1342132 will be displayed on the standard output.

标准输出将显示1342132的值。


http://www.ppmy.cn/news/1526082.html

相关文章

集群聊天服务器项目【C++】(四)cmake介绍和简单使用

我们上次用shell命令和vscode编译链接muduo库服务端代码,本章节实现编写CMakeLists.txt来编译项目。本次简单介绍CMake,并用Cmake编译上次的muduo服务器代码。 1.为什么使用cmake 我们在编译项目时,如果编写Makefile的话,常常会…

QT Mode/View之View

目录 概念 使用已存在的视图 使用模型 使用模型的多个视图 处理元素的选择 视图间共享选择 概念 在模型/视图架构中,视图从模型中获取数据项并将它们呈现给用户。数据的表示方式不必与模型提供的数据表示形式相似,而且可能与用于存储数据项的底层数…

AI 工具如何提高工作效率

文章目录 AI 工具如何提高工作效率 How AI Tools Improve Work Efficiency?引言 Introduction1 AI 工具是什么? What is AI Tool?1.1 AI工具的核心技术 Core Technologies of AI Tools1.2 机器学习 Machine Learning1.3 自然语言处理 Natural Language Processing…

【案例71】配置https之后 IE打不开登陆页面 Uclient没有问题

问题现象 配置https之后 IE打不开登陆页面 Uclient没有问题。 jvm控制台 显示如下 basic: 已调整小应用程序大小且已将其添加到父容器中 basic: PERF: AppletExecutionRunnable - applet.init() BEGIN ; jvmLaunch dt 170755 us, pluginInit dt 722531 us, TotalTime: 89328…

linux04

1.which命令 which查看命令的位置,例如which cd,结果是/usr/bin/cd 2.find命令 find命令查找文件,可以按名字查找,也可以按文件大小查找。类似windows系统中文件搜索。 (1)按名字搜索格式:find 起始位置 -name 名字…

15_分布式数据结构

菜鸟: 老鸟,我最近在处理大量数据的时候遇到了瓶颈,单台服务器的内存和计算能力都不够用了。你知道有什么方法可以解决这个问题吗? 老鸟: 嗯,这种情况很常见。你可以考虑使用分布式数据结构。听说过吗&a…

AutoSarAP通信的事件数据访问和管理

1. 事件数据访问(Accessing Event Data) GetNewSamples () 函数的作用 这是服务消费者在成功订阅事件后获取 Sample 的关键函数。它从通信管理(Communication Management,CM)缓冲区获取新数据,并通过回调函…

基于OpenCV和ROS节点的智能家居服务机器人设计流程

一、项目概述 1.1 项目目标和用途 智能家居助手项目旨在开发一款高效、智能的服务机器人,能够在家庭环境中执行多种任务,如送餐、清洁和监控。该机器人将通过自主导航、任务调度和环境感知能力,提升家庭生活的便利性和安全性。项目的最终目…