理解 Go 中的 Defer 和命名回傳值
在 Go 中,defer 語句允許函數在周圍函數傳回後執行程式碼。此行為可用於修改周圍函數的命名回傳值。
請考慮以下範例:
func c() (i int) { defer func() { i++ }() return 1 }
即使使用了 return 1 語句,函數也會傳回 2。這是因為 defer 語句將函數呼叫壓入堆疊,該函數呼叫在周圍函數返回之前立即執行。因此,i 語句在 return 1 語句之後執行,將 i 的值遞增到 2。
瞭解裸回
澄清「裸回傳」非常重要Go 中的「return」指的是不帶任何參數的 return 語句。在這種情況下,命名回傳值無需明確賦值即可傳回。
func a() (i int) { i = 2 return }
此函數傳回 2,因為裸回傳語句傳回命名回傳值 i,該值之前已賦值為 2。
結合 Defer 和非裸回傳
在函數 c 的範例中, defer 語句在執行 return 1 語句後修改指定的回傳值 i。這實際上等效於以下程式碼:
func c() (i int) { i = 1 defer func() { i++ }() }
在這種情況下,return 語句仍然傳回 1,但 defer 語句在函數傳回之前遞增 i 的值。
以上是Go 中的「defer」語句和命名回傳值如何互動?的詳細內容。更多資訊請關注PHP中文網其他相關文章!