defer的概念
defer调用再函数结束时发生,具体概念可以直接百度或者google详细搜索详细,这里主要是通过几个实例来对defer进行详解.
defer实例
实例1
package main
import "fmt"
func tryDefer() {
defer fmt.Println(1)
fmt.Println(2)
}
func main() {
// 2
// 1
tryDefer()
}
实例2
package main
import "fmt"
func tryDefer() {
defer fmt.Println(1)
defer fmt.Println(2)
fmt.Println(3)
}
func main() {
// 3
// 2
// 1
tryDefer()
}
实例3
package main
import "fmt"
func tryDefer() {
defer fmt.Println(1)
defer fmt.Println(2)
fmt.Println(3)
panic("error test")
fmt.Println(4)
}
func main() {
// 3
// 2
// 1
// panic: error test
tryDefer()
}
实例4
package main
import (
"bufio"
"fmt"
"learngo/errhandling/fib"
"os"
)
func writeFlie(fileName string) {
file, err := os.Create(fileName)
if err != nil {
panic(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
defer writer.Flush()
f := fib.Fib()
for i := 0; i < 20; i++ {
fmt.Fprintln(writer,f())
}
}
func main() {
writeFlie("fib.text")
}
package fib
func Fib() func() int {
a, b := 0, 1
return func() int {
a, b = b, a+b
return a + b
}
}
实例5
package main
import (
"fmt"
)
func tryDefer1() {
for i := 0; i < 10; i++ {
defer fmt.Println(i)
if i == 5 {
panic("error test")
}
}
}
func main() {
// 5
// 4
// 3
// 2
// 1
// 0
// panic: error test
tryDefer1()
}
- defer调用确保调用再函数结束时发生
- 参数再defer语句时计算
- defer列表为后进先出
何时使用defer调用
- Open/Close
- Lock/Unlock
- PrintHeader/PrintFooter