我有兩個代碼示例:func test() int { var x int defer func() { x++ }() x = 1 return x}func main() { fmt.Println(test())}它返回:1。但是,以下代碼示例的行為有所不同:func test() (x int) { defer func() { x++ }() x = 1 return}func main() { fmt.Println(test())}它返回2。
1 回答
慕俠2389804
TA貢獻1719條經驗 獲得超6個贊
Golang 規范對于 defer 語句是這樣說的:
[...]如果延遲函數是函數文字并且周圍函數具有在該文字范圍內的命名結果參數,則延遲函數可以在返回結果參數之前訪問和修改結果參數。
(我的重點)
在您的第一個片段中,函數test沒有命名返回參數;x只是一個局部變量。因此,您的 defer 語句無法修改 function 的結果test。
在第二個代碼片段中,函數test有一個命名的返回參數x,該參數位于函數文字的范圍內。因此, defer 語句可以(并且確實)修改 function 的結果test。
- 1 回答
- 0 關注
- 164 瀏覽
添加回答
舉報
0/150
提交
取消
