golang defer和return

这些细节实际项目中未必会用到,可能可读性较差

 

defer函数用到变量时,变量已经定义,这个分两种情况,是否闭包,

闭包使用引用,最后到defer执行时,可能变量已经被改变。

 

return发生分为两步,第一步给返回值赋值,例如

return res   先给res赋值,再执行defer函数,最后返回。

 

以下分三种情况

func test() (res int) {
	res = 1
	defer func() {
		res++
	}()
	return 0
}

 此情况下,return时res赋值为0,执行defer函数 res++,res为1,最后返回值为1

 

第二种情况

 func test() (res int) {
    tmp := 1
    defer func() {
        tmp++
    }()
    return tmp
}

 return之前,res = tmp,此时res为1,tmp++,tmp值为2,最后返回1

 

例三

func f2() *int {
    res := 1
    defer func(){res++}()

    return &res

}

  return &res”把i的地址赋值给返回值,同样是临时变量‘tmp *int’。即,真正返回的是i的地址*tmp。然后,执行defer的时候,对tmp指针没操作,但是tmp指向的那个值(即i),修改成了2。所以,如果对返回的指针取值,结果是2。和传址参数一样理解

 

12.30更新

func watShadowDefer(i int) (ret int) {
    ret = i * 2
    if ret > 10 {
        ret := 10
        defer func() {
            ret = ret + 1
        }()
    }
    return
}

func main() {
    result := watShadowDefer(50)
    fmt.Println(result)
}

因为变量作用域,内部ret和外部ret不是一个变量,defer改变的内部ret,返回不变,结果为100

 

posted @ 2020-09-27 18:38  海拉尔  阅读(1051)  评论(0编辑  收藏  举报