golang 基础(28)defer

作者: zidea | 来源:发表于2019-04-03 07:49 被阅读9次
square-gopher.png

资源管理与出错处理

defer 调用

有的时候我们需要程序发生错误后需要进行后续的处理,例如关闭文件、结束网络连接等。这时候我们就会用到 def ,如果是 java 的 developer 可以理解为 finally。

  • 确保在函数结束时发生
  • 参数在 defer 语句时计算
  • defer 列表为后进先出
var wg sync.WaitGroup

func say(s string){
    for i:=0; i < 3; i++ {
        fmt.Println(s)
        time.Sleep(time.Millisecond * 100)
    }

    wg.Done()
}

func main(){
    wg.Add(1)
    go say("Hey")
    wg.Add(1)
    go say("There")

    wg.Add(1)
    go say("Hi")
    wg.Wait()
}

func say(s string){
    defer wg.Done()
    for i:=0; i < 3; i++ {
        fmt.Println(s)
        time.Sleep(time.Millisecond * 100)
    }

}
![600_478303968.jpeg](https://img.haomeiwen.com/i8207483/08dcf0aacf26d768.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
func tryDefer(){
    fmt.Println(1)
    fmt.Println(2)
}

func main(){
    tryDefer()
}
1
2
func tryDefer(){
    defer fmt.Println(1)
    fmt.Println(2)
}

使用 defer 就会

2
1

defer 相对来说是一个栈先进后出

func tryDefer(){
    defer fmt.Println(1)
    defer fmt.Println(2)
    fmt.Println(3)
    
}
3
2
1

加了 defer 就不怕程序中间 return 甚至是 panic

func tryDefer(){
    defer fmt.Println(1)
    defer fmt.Println(2)
    fmt.Println(3)
    return
    fmt.Println(4)
}
func writeFile(filename string){
    file,err := os.Create(filename)
    if err !=nil {
        panic(err)
    }
    defer file.Close()
    writer := bufio.NewWriter(file)
    defer writer.Flush()

    f := fib.Fibonacci()

    for i := 0; i < 20; i++{
        fmt.Fprintln(writer,f())
    }
}

避免我们忘记,可以只写 defer

for i:=0; i < 100; i++ {
        defer fmt.Println(i)
        if i == 30 {
            panic("printed too many")
        }
    }
3
2
1
0
panic: printed too many

相关文章

  • golang 基础(28)defer

    资源管理与出错处理 defer 调用 有的时候我们需要程序发生错误后需要进行后续的处理,例如关闭文件、结束网络连接...

  • go defer理解

    golang的defer是怎么工作的?defer在golang里是一个很基础的关键字,在函数内部使用defer声明...

  • Golang之Defer

    引用 golang defer实现原理 Golang之轻松化解defer的温柔陷阱 Golang中defer、re...

  • 2017-12-04

    Golang,Panic,Defer,Recover 在golang中,recover在defer里发挥作用。 一...

  • golang中defer执行时机与常见问题

    defer是什么? defer的用途 defer的执行时机 了解defer的执行时机首先要知道golang的ret...

  • 聊聊golang的defer

    序 本文主要研究一下golang的defer defer return先赋值(对于命名返回值),然后执行defer...

  • 12 Golang defer panic recover

    defer Golang中的defer会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处...

  • 2017-11-23 step

    1 Golang的返回值,return,defer 多个defer的顺序是stack顺序,FILO 正确的顺序是:...

  • Golang defer

    话题起于同事在微信群里发了张图,是Go Newsletter于13日在Twitter上转的一个代码截图,问输出是啥...

  • golang defer

    The arguments to the deferred function (which include the...

网友评论

    本文标题:golang 基础(28)defer

    本文链接:https://www.haomeiwen.com/subject/oslwmqtx.html