美文网首页
golang:defer语句

golang:defer语句

作者: 程序员饭饭 | 来源:发表于2017-12-28 13:22 被阅读0次
  defer語句將函數調用壓到棧中,函數調用的順序遵循Last In First Out的原則。棧中的函數將在調用函數返回之後被執行。defer通常用在簡單的函數來執行清理工作。
Example:
func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }

    dst, err := os.Create(dstName)
    if err != nil {
        return
    }

    written, err = io.Copy(dst, src)
    dst.Close()
    src.Close()
    return
}
上述的代碼中存在一個bug,如果在os.Create()函數執行失敗後,打開的文件將不能關閉,所以補救的措施就是在os.Create()函數創建失敗return的時候,執行src.Close()語句。但是問題來了,如果函數很複雜以至於問題不能被輕易的發現怎麼辦,所以這裡使用defer語句就可以方便解決這個問題。
改寫後的代碼如下:
func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }
    defer src.Close()

    dst, err := os.Create(dstName)
    if err != nil {
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}
defer語句的行為是簡單直觀,並且可預測。關於defer有下面三條簡單的規則:
  1. defer語句給定的時候,defer函數的參數也是給定的
// 該函數打印的值為0
func a() {
    i := 0
    defer fmt.Println(i)
    i++
    return
}
  1. defer函數調用在調用函數返回之後按照LIFO的順序被執行
// 該函數將打印"3210"
func b() {
    for i := 0; i < 4; i++ {
        defer fmt.Print(i)
    }
}
  1. defer函數可能對函數返回值進行重新讀取和賦值
// 該函數的返回值為2
func c() (i int) {
    defer func() { i++ }()
    return 1
}
這對於修改函數的錯誤返回值是很方便的。

相关文章

  • golang:defer语句

      defer語句將函數調用壓到棧中,函數調用的順序遵循Last In First Out的原則。棧中的函數將在調...

  • Golang defer总结

    0 Golang有一个特殊的控件语句,那就是defer,defer语句用于延迟调用指定的函数,比如释放资源等,它会...

  • 12 Golang defer panic recover

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

  • Golang之Defer

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

  • golang语言defer特性详解.md

    [TOC] golang语言defer特性详解 defer语句是go语言提供的一种用于注册延迟调用的机制,它可以让...

  • Golang(十五)defer语句

    defer` 1.1 延迟是什么? 即延迟(defer)语句,延迟语句被用于执行一个函数调用,在这个函数之前,延迟...

  • 2017-12-04

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

  • golang defer语句简单解析

    defer 下面举例说明了defer语句的作用: 输出结果: 很明显 defer语句的执行顺序是反的。这种语法给我...

  • go defer理解

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

  • 29. Defer

    29. Defer 什么是 defer? defer 语句的用途是:含有 defer 语句的函数,会在该函数将要返...

网友评论

      本文标题:golang:defer语句

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