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