//输出1//defer语句中的函数调用的参数是在defer语句执行时就确定的,而不是在defer函数实际执行时才确定的funcdeferFuncParameter(){var aInt =1defer fmt.Println(aInt)
aInt =2return}//返回2,一个具名返回值result,返回i以后执行defer进行累加//1. 首先,函数定义了一个名为result的返回值变量,初始值为0。//2.然后,函数内部创建了一个局部变量i,并赋值为1。//3.接着,函数遇到了return i语句,此时它会将i的值赋给result变量,也就是说result变为1。//4.紧接着,函数执行defer语句中的匿名函数,该函数会将result变量递增1,也就是说result变为2。//5.最后,函数携带当前的result变量作为返回值退出,也就是说它返回了2。funcdeferFuncReturn()(result int){
i :=1deferfunc(){
result++}()return i
}
funcTestExecute1(t *testing.T){//4println(MyFun1(1))//1println(MyFun2(1))//3println(MyFun3(1))}//具名反参,因为r是具名反参,在函数执行时已经被定义出来了//内部对r的多次操作始终是基于一个地址值进行的,funcMyFun1(i int)(r int){
r = i
deferfunc(){
r +=3}()return r
}funcMyFun2(i int)int{//1.创建t变量,赋值为i
t := i
//2.将defer压入栈中,但是还未执行deferfunc(){
t +=3}()//3.返回变量t,此时t与i相等//由于是未命名反参,执行defer时内部"t+=3"//与此处t是两个不相干的变量,所以最终该函数返回1return t
}funcMyFun3(i int)(r int){//1.将defer压入栈中deferfunc(){
r += i
}()//2.返回2,将2赋值给变量r//然后执行defer,将i再累加到r上//最终该函数返回3return2}
funcincreaseA()int{var i intdeferfunc(){
i++}()return i
}funcincreaseB()(r int){deferfunc(){
r++}()return r
}funcmain(){
fmt.Println(increaseA())//0
fmt.Println(increaseB())//1}