Golang: Defer

By Xah Lee. Date: .

Defer statement is a new flow control, not in other popular languages.

it's used like this:

defer function_name(args)

When this is run, the args are evaluated, but the function call is not. The function is called right before the outer function exits.

package main

import "fmt"

func ff(x int) int {
    fmt.Printf("ff called. arg is %v\n", x)
    return x
}

func main() {

    var x = 3

    fmt.Printf("main. x is %v\n", x)

    defer ff(x)

    x = 4

    fmt.Printf("main. x is %v\n", x)

}

// main. x is 3
// main. x is 4
// ff called. arg is 3

Defer is used similar to “finally” in other languages, to do some clean up.

Usually, it's used right after the file opening call, to close a file.

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)
}

// 2018-08-26 code from
// https://blog.golang.org/defer-panic-and-recover

Reference

The Go Programming Language Specification - The Go Programming Language#Defer_statements

If you have a question, put $5 at patreon and message me.

Golang

  1. Compile, Run
  2. Source Encoding
  3. Package, Import
  4. Comment
  5. Print
  6. String
  7. String Backslash Escape
  8. Rune
  9. Variable
  10. Zero Value
  11. Constant
  12. If Then Else
  13. Switch/Case
  14. Loop
  15. Basic Types
  16. Array
  17. Slice
  18. Map
  19. Struct
  20. Function
  21. Pointer
  22. String as Chars
  23. regexp
  24. Read File
  25. Write to File
  26. Walk Dir
  27. Check File Exist
  28. System Call
  29. Get Script Path
  30. Pointer
  31. Defer
  32. Random Number

Examples

  1. Match Any Regexp
  2. Find Replace
  3. Validate Links
  4. Generate Sitemap

Reference

  1. Go Spec