Golang中多个defer的执行顺序以及defer在什么情况可以修改返回值

本文介绍了Defer的作用,包括延迟执行函数、确保资源释放(如锁、文件、链接)以及避免panic时的内存泄露。它详细讲述了多个defer调用的LIFO执行顺序,并展示了如何通过defer修改函数返回值,特别是在有名返回值和函数返回指针的情况。
摘要由CSDN通过智能技术生成

Defer 作用:defer 延迟函数,释放资源,收尾工作;如释放锁,关闭文件,关闭链接,捕获  panic
避坑指南:defer 函数紧跟在资源打开后面,否则 defer 可能得不到执行,导致内存泄露。

一、多个defer的执行顺序

        多个 defer 调用顺序是 LIFO(后入先出),defer后的操作可以理解为压入栈中。

        defer,return,return value(函数返回值) 执行顺序:首先return,其次return value,最后defer。

二、defer可以修改函数最终返回值,修改时机

        有名返回值或者函数返回指针。

        1、有名返回值

func b() (i int) {
	defer func() {
		i++
		fmt.Println("defer2:", i)
	}()
	defer func() {
		i++
		fmt.Println("defer1:", i)
	}()
	return i //或者直接写成return
}

func main() {
	fmt.Println("return:", b())
}


// 输出:
// defer1: 1
// defer2: 2
// return: 2

        2、函数返回指针

func c() *int {
	var i int
	defer func() {
		i++
		fmt.Println("defer2:", i)
	}()
	defer func() {
		i++
		fmt.Println("defer1:", i)
	}()
	return &i
}

func main() {
	fmt.Println("return:", *(c()))
}

// 输出:
// defer1: 1
// defer2: 2
// return: 2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值