延遲執行
說明完指標、方法、類別與介面後我們再回到關於 go 的方法流程的介紹, go 流程是由上而下逐步執行,但是這只是通則而已,因為接下來要介紹的內容如,多執行續以及本篇要說明的延遲執行 defer
則是例外,本篇會先說明延遲執行的內容。
延遲執行的撰寫
究竟延遲執行是甚麼樣的語法呢,簡單講就是先跳過 defer
這關鍵字所在的語法往下執行,直到方法結束後才會開始執行 defer
內的內容,光這樣說明讀者可能會一頭霧水,接下來我們先介紹如何寫以及說明流程的運作方式。
延遲執行的指令
首先先說明如何撰寫延遲執行的語法,請大家先看看下列例子
package main
import "fmt"
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}
上面是Go Tour的一個例子,他執行之後會有以下的內容出現
hello
world
由此可知他執行的先後順序會先跳過 defer
這關鍵字所在的方法,先執行下面的方法,等到整個方法執行完畢後才會執行 defer
的內容。
不過如果有多個 defer
那又該如何決定執行順序呢,這下一段落在說明。
延遲執行的先後順序
在上一段落說明了 defer
跟一般流程不同的地方,接下來如果有多個 defer
那又該如何決定誰先誰後呢,請大家先看看下列例子
package main
import "fmt"
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println("inner:", i)
}
for i := 0; i < 10; i++ {
fmt.Println("outter", i)
}
fmt.Println("done")
}
defer
的流程是一個堆疊的概念,先放進去的最後才會執行,所以上述例子執行出來的結果如下
counting
outter 0
.
.
outter 9
done
inner: 9
.
.
inner: 0
因為列印出來的內容有點多,所以筆者省略其中一些內容,由上述例子可以知道一般流程的進行方式是由上而下一個一個執行,但是遇到 defer
會先把它放到堆疊 stack
裡面,等到目前執行的這方法結束後再把堆疊的東西以後進先出的順序依序執行,所以可以看到上述的結果。
結論
本篇說明關於 go 的方法流程中的一個例外,這常會用在需要先回調的狀況,或是需要先讀取檔案再作後續讀黨完成的內容時可以使用。下篇要跟大家介紹關於 go 的多執行序。