defer与返回值的问题,这个问题主要考察对return语句的理解,"return xxx"包含三个步骤
(1)返回值=xxx
(2)调用defer函数
(3)将返回值返回
当返回值没有声明时,你可以把返回值当作一个Go语言自己声明的变量,如下代码

package main

import "fmt"

func main() {
	fmt.Println(f1())//打印0
}
func f1() int {
	var a int
	defer func() {
		a++
	}()
	//返回值=a,此时a=0
	//执行defer,a++,此时a=1
	//返回 返回值,返回值=0
	return a
}

当返回值提前声明时

package main

import "fmt"

func main() {
	fmt.Println(f1())//打印1
}
func f1() (a int) {
	
	defer func() {
		a++
	}()
	//返回值a=a,此时a=0
	//执行defer,a++,此时a=1
	//返回a
	return a//等价与return
}

再看一种情况

package main

import "fmt"

func main() {
	fmt.Println(f1())//打印6
}
func f1() (a int) {
	defer func() {
		a++
	}()
	//返回值a=5
	//执行a++,此时a=6
	//返回a
	return 5
}

再看一种情况

package main

import "fmt"

func main() {
	fmt.Println(f1())//打印5
}
func f1() (y int) {
	x:=5
	defer func() {
		x++
	}()
	//y=x,此时x=5,y=5
	//执行x++,此时x=6,y=5
	//返回y
	return x
}

最后一种情况

package main

import "fmt"

func main() {
	fmt.Println(f1())//打印6
}
func f1() (x int) {
	defer func(x int) {
		x++
	}(x)
	//x=5
	//x++
	//返回x
	return 5
}