Golang 中以不同方式宣告的變數的Defer 行為
與使用輸入參數的函數相比,使用defer 語句時,具有命名結果參數的函數的行為不同。在這個範例中,我們檢查這些差異:
package main import ( "fmt" ) func c(i int) int { defer func() { i++ }() return i } func c1() (i int) { defer func() { i++ }() return i } func c2() (i int) { defer func() { i++ }() return 2 } func main() { fmt.Println(c(0)) // Prints 0 fmt.Println(c1()) // Prints 1 fmt.Println(c2()) // Prints 3 }
c(i int):
在本例中,i 是傳入參數。返回值在延遲函數運行之前計算,因此在返回後遞增 i 沒有任何效果。
c1():
這裡,i 是結果參數。 return i 語句將 i 的值賦給回傳值。但是,延遲函數可以修改返回變數。在這種情況下,延遲函數遞增 i,導致返回值為 1。
c2():
與 c1() 類似,return 2 語句將 2 賦給 i。然而,在這種情況下,延遲函數在 return 語句之後執行,導致傳回值為 3。
總之,在 Go 中使用命名結果參數時,重要的是要記住延遲函數可以修改即使在 return 語句之後,它們的值也是如此。 Go 規範中明確提到了此行為,並可在必要時用於更改返回值。
以上是Go 的「defer」語句如何影響宣告為輸入參數與命名結果參數的變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!