defer延迟执行

defer延迟执行

代码

//example.go
package test

import "fmt"

//该函数为闭包函数
func deferUtil() func(int) int {
	i := 0
	return func(n int) int {
		fmt.Printf("本次调用接收到n=%v\n", n)
		i++
		fmt.Printf("匿名工具函数被第%v次调用\n", i)
		return i
	}
}

/*
本次调用接收到n=2
匿名工具函数被第1次调用
本次调用接收到n=1
匿名工具函数被第2次调用
*/
func Defer1() int {
	f := deferUtil()
	defer f(1)
	return f(2)
} //当Defer1函数返回之后,被延迟执行的函数就会按照先进后出的顺序进行调用

/*
本次调用接收到n=3
匿名工具函数被第1次调用
本次调用接收到n=2
匿名工具函数被第2次调用
本次调用接收到n=1
匿名工具函数被第3次调用
*/
func Defer2() int {
	f := deferUtil()
	defer f(f(3)) //参数会被立即求值
	return f(2)
}

/*
本次调用接收到n=1
匿名工具函数被第1次调用
本次调用接收到n=2
匿名工具函数被第2次调用
*/
func Defer() int {
	f := deferUtil()
	f(1)
	return f(2)
}

/*
	关于defer:
		1.	被延迟执行的函数会压入到栈中,当return之后,被延迟执行的函数会按照先进后出的顺序调用
		2.	延迟执行的函数,其参数会被立即求值
*/

//defer...recover的使用
func DeferRecover() {
	//recover会捕获异常,将捕获后的异常信息放到err中
	//如果没有异常信息,那么为nil
	//匿名函数
	defer func() {
		err := recover()
		if err != nil {
			//输出异常信息
			fmt.Println(err)
		}
	}()
	n := 0
	fmt.Println(3 / n)
}
//main.go
package main

import (
	"GoExample/test"
	"fmt"
)

/*
runtime error: integer divide by zero
test.DeferRecover()之后还在运行....
*/
func main() {
	test.DeferRecover()
	fmt.Println("test.DeferRecover()之后还在运行....")
}

	本博客参考自:
		https://www.bilibili.com/video/BV1s341147US/?spm_id_from=333.337.search-card.all.click&vd_source=a642bb3ddc5b706845426dc41d73fbda
posted @   夏目^_^  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示