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
}