golang之panic/defer/recover

2020-06-08  本文已影响0人  10xjzheng

defer

package main

import "fmt"

func main() {
    fmt.Println(f()) //输出 3
    fmt.Println(g())//输出 5
    fmt.Println(h())//输出 1
}

func f() (rint) {
    r= 2
    defer func() {
        r++
    }()
    return r
}

func g() (r int) {
    t := 5
    defer func() {
        t = t + 5
    }()
    return t
}
func h() (r int) {
    defer func(r int) {
        r = r + 5
    }(r)
    return 1
}

上述例子中:
f() 是有名返回值,执行return先给result赋值,此时r=2,再执行defer,执行后r=3,最后返回r= 3;
g() 有名返回值,执行return先给r赋值,r = t =5,再执行defer,此时修改了t = 10,最后返回的是r=5.

h() 有名返回值,执行return先给r赋值r=1, 但defer里面的r是形参,不会改变到外层的返回值r的值.

panic

类似其它语言的Exception,即异常。

recover

类似其它语言的try catch.

例子:

package main

import "fmt"

func main() {
    defer func() {
        if err := recover(); err!= nil {
            fmt.Println("Error message:", err)
        }
    }()
    defer func() {
        fmt.Println("Don't Fuck")
    }()
    panic("Fuck you")
}
上一篇 下一篇

猜你喜欢

热点阅读