Golang 筆記
  • Introduction
  • 安裝Golang
    • 本地編譯與安裝第三方套件
    • 第一個 GO 程式
    • export 與 import
    • 使用 go mod
  • 基本工具
  • DataBase操作
    • MySQL
    • 使用 ORM
    • MongoDB
  • 基本語法
    • Variable
    • BSON
    • JSON
    • 時間相關
    • Interface
    • Error
    • 型別
    • 字串
    • defer
    • panic, recover
    • Channel 與Goroutine
      • 讀寫鎖
      • for select 與 for range
      • UnBuffered channel 與 Buffered channel
    • Function
    • pointer
    • regExp
    • fmt
    • Make vs New
    • struct
    • Array, Slice 陣列
    • map
  • 核心模組
    • Reflect
    • File
    • Signal
    • BuiltIn
    • Sync
    • IO
    • Sort
    • http
    • crypto
    • context
  • 第三方模組
    • Dom Parser
    • gin 框架
    • Websocket
    • Iris框架
      • 讀取 Body 資料
      • 相關範例
    • Fiber 框架
    • 自動重啟 server 工具
    • go-jwt
  • 測試
  • 原始碼解析
  • 常見問題
    • 資料存取不正確
    • Data races
Powered by GitBook
On this page
  • 範例1:
  • 範例2:
  • 如果多個defer會相反方向執行
  • defer 會保留當下狀態

Was this helpful?

  1. 基本語法

defer

defer 會在外層 function return 後才執行,但會記得當下defer的狀態

即使發生錯誤或panic,defer 還是會執行

範例1:

package main

import "fmt"

func deferredFunc() {
    fmt.Println("deferredFunc")
}

func main() {
    defer deferredFunc()
    fmt.Println("Hello, 世界")
}

範例2:

func a() {
    i := 0
    defer fmt.Println(i)
    i++
    return
}

如上的 defer 會在 a return 後印出 0

假設是 for 迴圈的 defer 則會推入類似 stack 內,先進後出

func b() {
    for i := 0; i < 4; i++ {
        defer fmt.Print(i)
    }
}

印出 3 2 1 0

再來試著讀取回傳值的defer

package main

import (
    "fmt"
)

func main() {
    fmt.Println(c())
}

func c() (i int) {
    defer func() { i++ }()
    return 3
}

會印出4,因為 c 的 return 為 i

如果多個defer會相反方向執行

defer fmt.Println("1")    
defer fmt.Println("2")
// 2 1

defer 會保留當下狀態

package main

import "fmt"

func main() {
    i := 10
    defer fmt.Println(i)    
    i++
    fmt.Println(i) 
}
// 11 10
Previous字串Nextpanic, recover

Last updated 5 years ago

Was this helpful?