Files
Go-StudyExample/example/originGoLanguage/DeferTest.go
T

134 lines
1.9 KiB
Go

/*
* @Author : huangzj
* @Time : 2020/7/13 14:37
* @Description:测试defer关键字、recover
*/
package originGoLanguage
import (
"fmt"
"time"
)
func TestDefer() {
//defer会在所有函数执行完成之后才进行执行
testDeferExe()
//defer产生的值是在对应位置的值,后面的变化不会产生影响
fmt.Println(testDeferValue())
//defer的执行是先进后出
testDeferExeOrder()
testDeferRecover() //defer对异常的捕获
testDeferRecoverOut() //外层异常捕获
}
func TestCtripException() {
fmt.Println("测试不进行捕获的情况")
testNotDefer()
fmt.Println("测试进行捕获的情况")
testDefer1()
}
func testNotDefer() {
go sayHello()
for i := 0; i < 10; i++ {
time.Sleep(5000)
fmt.Println(i)
}
}
func testDefer1() {
go sayHello1()
for i := 0; i < 10; i++ {
time.Sleep(5000)
fmt.Println(i)
}
}
func sayHello1() {
defer func() {
if err := recover(); err != nil {
fmt.Println("错误信息", err)
}
}()
}
func sayHello() {
var map1 map[string]int
//这里会发生异常
fmt.Println(map1["say"])
}
func testDeferRecover() {
//多个panic只会捕获最后一个
defer func() {
if err := recover(); err != nil {
fmt.Println("错误信息是:", err)
}
}()
panic1()
panic2()
panic3()
//一旦错误被捕获就不会继续运行
fmt.Println("我会继续运行")
}
func panic3() {
panic("panic3")
}
func panic2() {
panic("panic2")
}
func panic1() {
panic("panic1")
}
func testDeferRecoverOut() {
testDeferRecover()
fmt.Println("外层继续执行")
}
func testDeferExe() {
i := 0
defer func() {
fmt.Println(i)
}()
fmt.Println("i am after")
}
func testDeferValue() int {
i := 0
defer func() {
fmt.Println("first: ", i)
}()
i++
defer func() {
fmt.Println("second: ", i)
}()
i++
return i
}
func testDeferExeOrder() {
defer func() {
fmt.Println("first")
}()
defer func() {
fmt.Println("second")
}()
defer fmt.Println("third")
}