一、defer
package main
import (
"fmt"
"os"
"bufio"
)
func tryDefer() {
for i := 0; i < 100; i++ {
defer fmt.Println(i)
if i == 30 {
// Uncomment panic to see
// how it works with defer
panic("printed too many")
}
}
}
func writeFile(filename string) {
file, err := os.OpenFile(filename,
os.O_EXCL|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
if pathError, ok := err.(*os.PathError); !ok {//錯誤處理,向下轉型
panic(err)
} else {
fmt.Printf("%s, %s, %s\n",
pathError.Op,
pathError.Path,
pathError.Err)
}
return
}
defer file.Close()//無論return、panic最後都會被執行
writer := bufio.NewWriter(file)
defer writer.Flush()//先進後執行,後進先執行,退出時先執行Flush,再執行Close
f := Fibonacci()
for i := 0; i < 20; i++ {
fmt.Fprintln(writer, f())
}
}
func main() {
tryDefer()
writeFile("fib.txt")
}
輸出:
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
panic: printed too many
goroutine 1 [running]:
main.tryDefer()
/Users/jltxgcy/go/src/learn/errhandling/defer/defer.go:24 +0x111
main.main()
/Users/jltxgcy/go/src/learn/errhandling/defer/defer.go:56 +0x20
defer執行的順序是先進後執行,無論是return還是panic,defer都會執行,用於關閉資源等,通常是成對出現。