Top Page

read

defer

defer 是 Go 內建的函式,執行的時間點會在 function 要回傳前被執行。

package main

import "fmt"

func main() {
	defer fmt.Println("World")

	fmt.Println("Hello")
}

// => Hello
//    World

雖然 defer 是最後才執行,但是他接收到參數的時間點還是跟程式碼執行的順序有關:

package main

import "fmt"

func main() {
	cat := "BuiBui"
	defer fmt.Println(cat)

	cat = "MeiMei"
	fmt.Println("Which cat?")
}

// => Which cat?
//    BuiBui

最後得到的 cat 是 BuiBui,由此可以確定 defer 會先接完參數,再等到 function 結束前才執行。

最後 defer 的一個特點是 last-in-first-out,一般執行方法都會先呼叫的先執行,但在 defer 會是最後呼叫的先執行:

package main

import "fmt"

func main() {
	cat := "BuiBui"
	defer fmt.Println(cat)

	cat = "MeiMei"
	defer fmt.Println(cat)
}
// => MeiMei
//    BuiBui

如果用迴圈執行看看:

package main

import "fmt"

func main() {
	fmt.Println("Go!")

	for i := 0; i < 5; i++ {
		defer fmt.Println(i)
	}

	fmt.Println("Done!")
}
// => Go!
//    Done!
//    4
//    3
//    2
//    1
//    0

結尾

defer 的介紹就到此結束,有任何問題都歡迎與我告知 :)

Blog Logo

yuchan


Published