亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 defer 時在函數中返回值

使用 defer 時在函數中返回值

Go
翻翻過去那場雪 2023-05-22 16:55:29
我對返回值使用“延遲”有一些問題。我嘗試以不同的方式運行一個測試函數(只是 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


查看完整回答
反對 回復 2023-05-22
  • 1 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號