golang defer

文章详细阐述了Go语言中defer语句的执行机制,包括延迟函数参数在声明时即被确定,无参数时函数体内变量的影响,以及如何能修改具名返回值但不能修改匿名返回值的情况。通过对示例代码的分析,揭示了defer对函数执行流程的影响。
摘要由CSDN通过智能技术生成


defer会把声明的 延迟函数以及 函数的入参放到栈上,当外部的包含方法return之前,返回参数到调用方法之前调用。在defer语句声明的时候入参就已经确定下来了,所以如果要传入指定参数那么就要在defer前给入参赋值。

延迟函数的参数在defer语句出现时就已经确定下来了

type struct student{
	name string
}
func (st *student)fn(){
    defer fmt.Println(st.name)
    st.name = "zhangsan"
    return
}

defer 会打印 空字符串,name 的值在defer语句声明的时候就已经确定下来了,即拷贝了一份存到了栈上,后面的修改不会影响已经拷贝的数据。

延迟函数没有入参时,延迟函数体内的变量会受到影响

type struct student{
	name string
}
func (st *student)fn(){
    defer func(){
    	fmt.Println(st.name)
    }()
    st.name = "zhangsan"
    return
}

defer 打印 zhangsan,name并没有当做参数传进去,defer只是保存了一份匿名函数在栈上,执行匿名函数的时候才会去找name的值。

延迟函数 可以 修改主函数的 具名 返回值

func fn() (result int) {
    i := 1
    defer func() {
        result++
    }()
    return i
}

fn()返回 2。关键字return不是一个原子操作,实际上return只代理汇编指令ret,即将跳转程序执行;return实际上分两步:首先将 i 存入栈中作为返回值,然后跳转程序执行,而defer的执行时机正是跳转前,所以说defer执行时还是有机会操作返回值的。
即: result = i --> result++ --> return

延迟函数 无法 修改主函数的 匿名 返回值

func fn() int {
    var i int
    defer func() {
        i++
    }()
    return i
}

上面的函数,返回一个局部变量,同时defer函数也会操作这个局部变量。对于匿名返回值来说,可以假定仍然有一个变量存储返回值,假定返回值变量为“anony”,上面的返回语句可以拆分成一下过程。 anony = i --> i++ --> return;由于匿名返回值anony的值在defer修改 i 前就已经确定了,所以defer语句中修改i值,对函数返回值不造成影响。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值