golang defer关键字

defer关键字的作用

defer 会在当前函数或者方法返回(return)之前执行传入的函数。它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。

在go语言中,程序有defer语句并不会马上执行,而是会进入一个栈,函数return前,会按先进后出的顺序执行。也说是说最先被定义的defer语句最后执行。先进后出的原因是后面定义的函数可能会依赖前面的资源,自然要先执行;否则,如果前面先执行,那后面函数的依赖就没有了。

遇到defer关键字,会将后面的代码语句压入栈中,也会将相关的值同时拷贝入栈中,不会随着函数后面的变化而变化。

defer触发的时机:

  • 所在函数return时。
  • 所在函数执行结束时。
  • 所在goroutine发生恐慌(panic)时。
package main

import (
	"fmt"
)

func main() {
	fmt.Println(testSum(20, 30))
}
func testSum(num1 int, num2 int) int {
	defer fmt.Printf("num1的值为:%v\n", num1) //最先进入栈中,按照栈的特性,先进后出,retrun之前最后输出
	defer fmt.Printf("num2的值为:%v\n", num2) //最后进入栈中,按照栈的特性,先进后出,retrun之前最先输出
	num1 += 10
	num2 += 10
	var sum int
	sum = num1 + num2
	fmt.Printf("sum的值为:%v\n", sum) //先输出
	return sum                     //testSum中最后返回
}

执行结果

sum的值为:70
num2的值为:30
num1的值为:20
70
posted @   XIN-0808  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示