defer會常常用到,可是這個坑對於我並不會踩到,由於我一般不會用到命名返回參數,一則沒有多少必要,二則增長了代碼閱讀難度。不過,這個坑能讓人很好地理解return這個關鍵字,因此在此記錄下。函數
func test() (res int) { res = 1 defer func() { res++ }() return 0 }
默默在內心運行這個程序,第一個返回值應該是0嘛,其實否則,return並非個原子操做。分爲了,賦值和返回兩個操做,<return 0>實際上是等價於<res = 0, return res>,而defer是在賦值操做後執行的,因此這個函數等價於:code
func test() (res int) { res = 1 res = 0 //賦值 func() { res++ //defer }() return res //返回 }
再來看個例子:test
func test() (res int) { tmp := 1 defer func() { tmp++ }() return tmp }
按剛纔的經驗分析下這個程序,tmp=1,而後返回前又加了1,應該是2吧。其實又錯了,注意返回值命名是res,而不是tmp,defer改變的只能是tmp。這個函數能夠等價於:程序
func test() (res int) { tmp := 1 res = tmp func() { tmp++ }() return }
結果應該是1。經驗