先來看一段代碼:
package mainimport "fmt"func f() (ret int) {defer func() {ret++}()return 1
}
func main() {fmt.Println(f())
}
上面這段代碼的輸出是2,不是1
原因在于:
1)ret++ 是在執行 return 1 語句后發生的?
2)關鍵字 defer 允許我們推遲到函數返回之前(或任意位置執行 return 語句之后)一刻才執行某個語句或函數
所以整個f()函數的執行過程應該是這樣的:
1) 函數先是執行到return 1,然后根據函數的聲明,把1賦值給ret
2)在函數最后返回前,執行defer()操作,對ret進行+1操作,這時候ret=2
3)函數最終返回ret,所以2被main()所打印
這時候,如果我們修改代碼,把return 1改成 return 9:
package mainimport "fmt"func f() (ret int) {defer func() {ret++}()return 9
}
func main() {fmt.Println(f())
}
根據上面的流程:
1) 函數先是執行到return 9,然后根據函數的聲明,把9賦值給ret
2)在函數最后返回前,執行defer()操作,對ret進行+1操作,這時候ret=10
3)函數最終返回ret,所以10被main()所打印
總結就是:在最終函數全部返回之前,defer()函數才會調用,然后整個函數返回結束