Skip to content

Instantly share code, notes, and snippets.

@polebug
Last active April 29, 2019 00:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save polebug/b25d1b64a88fd30f2d83015afddc2ec5 to your computer and use it in GitHub Desktop.
Save polebug/b25d1b64a88fd30f2d83015afddc2ec5 to your computer and use it in GitHub Desktop.
go 中 defer 的用法
// 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