Go 中閉包體中“( )”背後的原理
Go 中,在閉包體後添加“( )”並不特定於閉包,而是適用於defer 語句中的任何函數呼叫。語言規範要求 defer 語句中的表達式必須始終是函數呼叫。
考慮範例:
defer f()
此表達式嘗試延後函數 f 本身的執行,這是沒有意義的。相反,正確的語法是:
defer f()()
這會建構一個閉包,捕獲當前上下文並在啟動 defer 語句時執行函數 f。外面的括號立即執行閉包,確保函數呼叫在 defer 語句執行後發生。
這種語法與 Go 中函數呼叫的一般用法一致,總是需要括號來執行它們。例如,要在定義閉包時列印i 的值,請使用以下語法:
defer func(n int) { fmt.Println(n) }(i)
相反,要在執行閉包時列印i 的值,請使用:
defer func() { fmt.Println(i) }()
理解這個原則可以清楚地理解Go 中defer 語句的行為以及閉包體內「( )」的正確用法,以及超越。
以上是為什麼在 Go 的 `defer` 語句中的閉包體後面使用「( )」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!