第一个例子:

    1. package main
    2. import (
    3. "fmt"
    4. )
    5. func main() {
    6. fmt.Println(a())
    7. }
    8. func a() (res int) {
    9. defer func() {
    10. res ++
    11. }()
    12. return res
    13. }

    上面这个例子打印结果是1,那是因为return在defer前执行,当执行到defer时,返回值res会自增一次,所有最后整个函数返回的就是1

    第二个例子:

    1. package main
    2. import (
    3. "fmt"
    4. )
    5. func main() {
    6. i := 0
    7. defer fmt.Println(i)
    8. i++
    9. return
    10. }

    第二个例子是为0,那是因为在defer执行前,就已经将i的值得到了,相当于是一个快照,所以,即使return的结果是1,但defer的值始终是之前的i := 0