golang 基础(28)defer

zidea · · 622 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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://upload-images.jianshu.io/upload_images/8207483-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

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:zidea

查看原文:golang 基础(28)defer

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

622 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传