2017-09-01 55 views
-1

我寫了如下代碼在golang,我推遲函數返回功能,什麼是

package main 

import "fmt" 

func main() { 
    defer func() func() { 
     fmt.Println("start") 
     return func() { 
      fmt.Println("end") 
     } 

    }()() 
    fmt.Println("aaaa") 
    return 

} 

,我除了輸出AAAA開始結束

,但實際輸出順序開始AAAA結束

我不明白爲什麼輸出 「AAAA」 之前 「啓動」

+0

您正在調用被調用的'func()func()'並返回'defer'調用的'func()'。在結尾'}()()'看到雙parens。你打電話給第一個,「延期」被告知叫第二個從第一個返回。 – RayfenWindspear

回答

2

specification says

每次執行「延遲」語句時,調用的函數值和參數都照常計算並重新保存,但實際函數未被調用。

延遲函數調用是延遲語句中的最後一個()。返回函數值的表達式在延遲語句時進行評估。

0

由於defer語句需要評估語句,在你的代碼中,func()(在defer關鍵字後面的func()函數返回一個函數類型),defer語句需要實際執行func()返回函數。所以你的代碼首先打印出「開始」。

如果你的函數沒有返回一個函數類型,那麼在封閉函數返回之前函數體不會被執行。