Last active
April 29, 2019 00:19
-
-
Save polebug/b25d1b64a88fd30f2d83015afddc2ec5 to your computer and use it in GitHub Desktop.
go 中 defer 的用法
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// defer 的用法: | |
// 当 defer 被声明时,其参数就会被实时解析 | |
// defer 执行顺序为先进后出 | |
// defer 可以读取有名返回值,可以改变有名返回参数的值 | |
package main | |
import "fmt" | |
func testDefer(para int) int { | |
// defer 可以改变有名返回参数的值 | |
var i int | |
defer func() { | |
i++; | |
}() | |
defer func() { | |
d := 0 | |
re := para/d | |
//捕捉到内部 Panic 错误之后,程序不会继续执行下去 | |
fmt.Println("被除数为0的除法报错", re) | |
if err := recover(); err != nil { | |
fmt.Printf("ERROR: %s\n", err) | |
} | |
}() | |
if para < 0 { | |
panic("参数不能小于0") | |
} | |
fmt.Println("success") | |
return i | |
} | |
func main(){ | |
// defer 执行顺序为先进后出 | |
defer fmt.Println("测试") | |
defer fmt.Print("defer") | |
defer fmt.Print("执行") | |
defer fmt.Print("顺序") | |
// 虽然 defer 执行顺序是先进后出,defer 被声明时,其参数会被实时解析 | |
var i int = 1 | |
defer fmt.Println("测试参数会被实时解析 ", func() int {return i*2}()) | |
i++ | |
// defer 可以改变有名返回参数的值 | |
re := testDefer(1) | |
fmt.Println("测试defer改变有名返回参数的值:", re) | |
// 测试 defer 报错作用 | |
// 捕捉内部的 Panic 错误 | |
testDefer(-1) | |
testDefer(-2) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment