第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

函數(shù)返回的常量是否自動成為命名返回變量的值

函數(shù)返回的常量是否自動成為命名返回變量的值

Go
繁星點(diǎn)點(diǎn)滴滴 2021-11-15 17:17:12
這是 Golang 中的一個(gè)函數(shù),它使用 defer 來改變函數(shù) c() 的命名返回值。package mainimport "fmt"func c() (i int) {     defer func() {  }()         defer fmt.Println("our i is", i)    return 45   }func main() {      fmt.Println(c())  }程序的輸出是:我們的 i 是 045更改代碼中的匿名 func()func c() (i int) {         defer func() { i = 1 }()           defer fmt.Println("our i is", i)        return 45       }    func main() {          fmt.Println(c())      }這導(dǎo)致輸出:我們的 i 是 01如果沒有其他值被放入 i 中,似乎返回值 45 會自動復(fù)制到 i 。但我不是 100% 確定這是否是輸出的確切原因
查看完整描述

1 回答

?
浮云間

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊

在延遲函數(shù)中,您有機(jī)會修改結(jié)果參數(shù)的值。

調(diào)用延遲函數(shù)時(shí),return語句中指定的值已經(jīng)設(shè)置。

如果有多個(gè)延遲函數(shù),它們會按 LIFO 順序(后進(jìn)先出)執(zhí)行。

在您的第二個(gè)示例中,fmt.Println()首先執(zhí)行,然后是另一個(gè)匿名函數(shù)。

但是你需要知道的是,當(dāng)defer語句執(zhí)行時(shí),延遲函數(shù)的參數(shù)會立即計(jì)算,而不是在延遲函數(shù)運(yùn)行時(shí)(稍后,在返回之前)。

規(guī)格:延遲語句:

每次執(zhí)行“defer”語句時(shí),函數(shù)值和調(diào)用的參數(shù)都會像往常一樣評估并重新保存,但不會調(diào)用實(shí)際的函數(shù)。相反,在周圍函數(shù)返回之前立即調(diào)用延遲函數(shù),以與延遲相反的順序調(diào)用。

所以這一行:

defer fmt.Println("our i is", i)

總是意味著fmt.Println()i = 0參數(shù)調(diào)用:

fmt.Println("our i is", 0)

因?yàn)楫?dāng)這條線運(yùn)行時(shí),i它的值為0。

因此,在您的第二個(gè)示例中fmt.Println()prints 0,然后運(yùn)行另一個(gè)設(shè)置i為的延遲函數(shù),1這就是返回的內(nèi)容。

您的第一個(gè)示例只是打印一些內(nèi)容 ( i = 0),但第一個(gè)示例中的延遲函數(shù)不會修改的值,i因此45將返回(并由 中的fmt.Println()函數(shù)打印main())。


查看完整回答
反對 回復(fù) 2021-11-15
  • 1 回答
  • 0 關(guān)注
  • 155 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號