我對返回值使用“延遲”有一些問題。我嘗試以不同的方式運行一個測試函數(只是 i 的定義不同),但結果不同。所以,我對不同的返回值感到困惑。這是問題所在:功能 1:package mainimport "fmt"func main() { fmt.Println("a return:", a()) // return value: 0}func a() int { var i int defer func() { i++ fmt.Println("a defer1:", i) // print " a defer1: 1" }() return i}返回值:a defer1: 1a return: 0功能2:package mainimport "fmt"func main() { fmt.Println("a return:", a()) // return value: 1}func a() (i int) { defer func() { i++ fmt.Println("a defer1:", i) // print " a defer1: 1" }() return i}返回值:a defer1: 1a return: 1一個返回值是0,另一個是1。所以,問題是這兩個函數有什么區別。
1 回答
素胚勾勒不出你
TA貢獻1827條經驗 獲得超9個贊
這兩個功能有什么區別?
Go 編程語言規范
推遲聲明
“延遲”語句調用一個函數,該函數的執行被推遲到周圍函數返回的那一刻。
每次執行“defer”語句時,調用的函數值和參數都會像往常一樣計算并重新保存,但不會調用實際函數。相反,延遲函數會在周圍函數返回之前立即被調用,順序與它們被延遲的順序相反。
如果延遲函數是一個函數文字,并且周圍的函數在文字范圍內命名了結果參數,則延遲函數可以在返回結果參數之前訪問和修改結果參數。如果延遲函數有任何返回值,它們將在函數完成時被丟棄。
不同之處在于帶有命名結果參數的周圍函數
func?a()?(i?int)
與具有未命名結果參數的周圍函數
func?a()?int
- 1 回答
- 0 關注
- 194 瀏覽
添加回答
舉報
0/150
提交
取消
