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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值