15. defer語句延遲函數的執行

當函數中有defer語句,會延遲此語句的執行,直到函數返回后才執行。

defer fmt.Println("")

defer后面的是參數
延遲調用的參數是立刻生成的,但是在上層函數返回前都不會去執行。
看例子,并運行看結果

package main

import "fmt"

func main() {
    defer fmt.Print("Hello")
    fmt.Print("World")
}

你認為執行結果是什么呢?肯定不是HelloWorld,而是

WorldHello

延遲的函數調用是被壓入一個棧中。當函數返回時,會按照后進先出的原則,調出被延遲的函數調用。請看下面例子中,i的打印順序。

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Begin...")
    for i := 0; i < 10; i++{
        defer fmt.Println(i)
    }
    fmt.Println("Done")
}

運行結果

Begin...
Done
9
8
7
6
5
4
3
2
1
0

看明白了么?
整個函數的輸出已經運行完了,打印了 Done ,然后才開始打印 for 循環的 defer,并且是后進先出的方式,是從 i = 9 開始打印的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • [TOC] golang語言defer特性詳解 defer語句是go語言提供的一種用于注冊延遲調用的機制,它可以讓...
    木鳥飛魚閱讀 4,204評論 3 4
  • 本文將會講解defer, recover,panic相關的知識。主要內容包括: defer的原理panic與rec...
    鏈人成長chainerup閱讀 1,103評論 0 0
  • 定義 defer語句被用于預定對一個函數的調用。我們把這類被defer語句調用的函數稱為延遲函數。 注意,defe...
    ycyoes閱讀 2,126評論 0 2
  • 我們之所以活得有滋有味、多姿多彩,是身份賦予的結果,每一種身份都代表著一個角色,雖然不同角色同時作用在我們身上,總...
    宋阿娜閱讀 400評論 0 7
  • 每接手一個班級,不講年級高低,我都得給孩子補課——補朗讀!不僅因為朗讀是學生語文學習最基本的一面,還因為可以通過朗...
    yhj靈閱讀 309評論 0 1