2 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
延遲函數(shù)作為函數(shù)中的最后一件事運(yùn)行,在 return 語(yǔ)句之后,所以annotate函數(shù)將首先運(yùn)行next,只有在返回之后,延遲函數(shù)才會(huì)運(yùn)行。根據(jù)您的代碼,它應(yīng)該打印的順序是:
first pre
second pre
third pre
my endpoint
third post
second post
first post

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是您的示例變成了在 Go 操場(chǎng)上運(yùn)行的東西。
請(qǐng)注意,如果您在給定函數(shù)中defer 多次調(diào)用,則每個(gè)延遲調(diào)用都按 LIFO 順序運(yùn)行。因此,如果您想使用defer確保您post首先被調(diào)用,然后是next操作,請(qǐng)考慮替換:
defer fmt.Println(s, "post")
next(ctx, request)
和:
defer next(ctx, request)
defer fmt.Println(s, "post)
當(dāng)然,在您的情況下,您想返回什么next返回,這會(huì)產(chǎn)生一個(gè)小問題。要在實(shí)際情況下解決這個(gè)問題,您需要一個(gè)小函數(shù)和一些命名的返回值:
defer func() { i, e = next(ctx, request) }()
其中i和e是命名的返回值。
這是相同的代碼變成了一個(gè)新示例,其中延遲調(diào)用以所需的順序發(fā)生。 在這種情況下,這個(gè)例子是相當(dāng)愚蠢的,因?yàn)闆]有任何恐慌,也沒有中間的“危險(xiǎn)步驟”,所以我們真正需要的是fmt.Println
按順序執(zhí)行這兩個(gè)調(diào)用,而不使用defer
. 但是,如果我們可以在the和 post 部分之間感到恐慌fmt.Println(s, "pre")
,那么這可能是有道理的。
- 2 回答
- 0 關(guān)注
- 119 瀏覽
添加回答
舉報(bào)