defer 函数和return混合使用的几个场景

package main

import "fmt"
func f1() int {
    i := 5
    defer func() {
        i++
    }()
    return i
}
func f2() *int {

    i := 5
    defer func() {
        i++
        fmt.Printf(":::%p\n", &i)
    }()
    fmt.Printf(":::%p\n", &i)
    return &i
}
func f3() (result int) {
    defer func() {
        result++
    }()
    return 5 
}

func f4() (result int) {
    defer func() {
        result++
    }()
    return result 
}

func f5() (r int) {
    t := 5
    defer func() {
        t = t + 1
    }()
    return t 
}
func f6() (r int) {
    fmt.Println(&r)
    defer func(r int) {
        r = r + 1
        fmt.Println(&r)
    }(r)
    return 5
}
func f7() (r int) {
    defer func( x int) {
        r = x  + 1
    }(r)
    return 5
}
func main(){
    //fmt.Println(f1())  // 5   匿名函数变量不影响局部变量
    // fmt.Println(f2())   // i =5, 取i的地址,进入匿名函数,i=6,取地址取的是外面的i的地址,返回i的地址,三次打印是一个地址
    // fmt.Println(f3())  // return =5, result 被赋值=5;defer内result++,result=6;返回result为6
    //fmt.Println(f4())  // return = result,defer内result,0+1=1,返回result为1
   // fmt.Println(f5())  // return为r,先把r =t, t =5,这是r也等于5;defer内 t+1 =6,返回的是r,还是5
   //fmt.Println(f6()) // return r, r=5,打印r的地址;defer内,打印机r的地址,此时是两个地址两个变量,这个匿名函数有形参,r=1;还是5
   fmt.Println(f7())  // return 5,r=5;指定defer这个闭包,实参r=5,x等于0,匿名函数结束r=1。返回1,此时r没有重新定义
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值