Bird
Raised Fist0
Goprogramming~20 mins

Why defer is used in Go - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Go Defer Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Go code using defer?
Look at this Go program. What will it print when run?
Go
package main
import "fmt"
func main() {
    defer fmt.Println("First")
    fmt.Println("Second")
    defer fmt.Println("Third")
}
A
Second
First
Third
B
First
Second
Third
C
Third
First
Second
D
Second
Third
First
Attempts:
2 left
💡 Hint
Remember defer calls run after the surrounding function finishes, in reverse order.
🧠 Conceptual
intermediate
1:30remaining
Why use defer in Go functions?
Which of these best explains why Go programmers use defer?
ATo run a function immediately before the current line
BTo delay execution of a function until the surrounding function returns
CTo run a function only if an error occurs
DTo run a function repeatedly in a loop
Attempts:
2 left
💡 Hint
Think about when deferred functions run compared to normal calls.
🔧 Debug
advanced
2:30remaining
What error occurs in this Go code using defer?
This Go code tries to defer closing a file. What error will it cause?
Go
package main
import (
    "fmt"
    "os"
)
func main() {
    f, err := os.Open("nofile.txt")
    if err != nil {
        fmt.Println("Error opening file")
        return
    }
    defer f.Close()
    fmt.Println("File opened")
}
Apanic: runtime error: invalid memory address or nil pointer dereference
Bcompile error: missing return statement
Cno error, prints "File opened"
Druntime error: index out of range
Attempts:
2 left
💡 Hint
What happens if os.Open fails and returns nil for the file?
❓ Predict Output
advanced
2:00remaining
What is the output order of deferred calls in this Go program?
Predict the output of this Go program with multiple defers.
Go
package main
import "fmt"
func main() {
    for i := 1; i <= 3; i++ {
        defer fmt.Print(i)
    }
}
A123
B111
C321
DError: cannot use i in defer
Attempts:
2 left
💡 Hint
Deferred calls run in last-in, first-out order.
🧠 Conceptual
expert
3:00remaining
What is a key benefit of using defer for resource management in Go?
Why is defer especially useful for managing resources like files or locks in Go?
AIt ensures cleanup code runs even if the function returns early or panics
BIt speeds up the execution of resource allocation
CIt allows resources to be shared between goroutines automatically
DIt prevents any errors from occurring during resource use
Attempts:
2 left
💡 Hint
Think about functions that might exit in many ways.

Practice

(1/5)
1. What is the main purpose of using defer in Go?
easy
A. To create a new goroutine
B. To run a function immediately
C. To delay a function call until the surrounding function finishes
D. To declare a variable

Solution

  1. Step 1: Understand the behavior of defer

    The defer keyword postpones the execution of a function until the surrounding function returns.
  2. Step 2: Compare options with this behavior

    Only To delay a function call until the surrounding function finishes correctly describes this delaying behavior, while others describe unrelated actions.
  3. Final Answer:

    To delay a function call until the surrounding function finishes -> Option C
  4. Quick Check:

    Defer delays function calls = A [OK]
Hint: Defer means 'do later' when function ends [OK]
Common Mistakes:
  • Thinking defer runs function immediately
  • Confusing defer with goroutine creation
  • Assuming defer declares variables
2. Which of the following is the correct syntax to defer a function call cleanup() in Go?
easy
A. defer cleanup()
B. defer = cleanup()
C. defer: cleanup()
D. defer -> cleanup()

Solution

  1. Step 1: Recall Go's defer syntax

    The correct syntax is the keyword defer followed by the function call without any assignment or punctuation.
  2. Step 2: Check each option

    Only defer cleanup() matches the correct syntax. Others use invalid symbols or assignment.
  3. Final Answer:

    defer cleanup() -> Option A
  4. Quick Check:

    Defer syntax is 'defer function()' = A [OK]
Hint: Defer always followed by function call without extra symbols [OK]
Common Mistakes:
  • Adding '=' after defer
  • Using ':' or '->' instead of space
  • Omitting parentheses on function call
3. What will be the output of this Go program?
package main
import "fmt"
func main() {
    defer fmt.Println("First")
    defer fmt.Println("Second")
    fmt.Println("Third")
}
medium
A. Third\nSecond\nFirst
B. Second\nFirst\nThird
C. First\nSecond\nThird
D. Third\nFirst\nSecond

Solution

  1. Step 1: Identify the order of deferred calls

    Deferred calls run after the surrounding function ends, in reverse order of their defer statements. So "Second" runs before "First".
  2. Step 2: Trace the print statements

    "Third" prints immediately, then deferred prints run: "Second", then "First".
  3. Final Answer:

    Third\nSecond\nFirst -> Option A
  4. Quick Check:

    Deferred calls run last in reverse order = C [OK]
Hint: Deferred calls run last, in reverse order [OK]
Common Mistakes:
  • Assuming deferred calls run in order declared
  • Thinking deferred calls run immediately
  • Mixing up print order
4. Identify the error in this Go code snippet:
func process() {
    defer close(file)
    file, err := os.Open("data.txt")
    if err != nil {
        return
    }
    // process file
}
medium
A. File is closed twice due to defer and explicit close
B. Defer is used before file is assigned, causing a compile error
C. Defer cannot be used with file operations
D. No error, code works fine

Solution

  1. Step 1: Analyze the order of statements

    The defer statement tries to close file before file is assigned by os.Open. This causes a compile error because file is undefined at defer time.
  2. Step 2: Understand defer evaluation timing

    Arguments to deferred functions are evaluated immediately, so file must be assigned before defer.
  3. Final Answer:

    Defer is used before file is assigned, causing a compile error -> Option B
  4. Quick Check:

    Defer arguments evaluated immediately = B [OK]
Hint: Defer arguments evaluated immediately, assign variables first [OK]
Common Mistakes:
  • Placing defer before variable assignment
  • Thinking defer delays argument evaluation
  • Assuming defer can't be used with files
5. You want to open multiple files and ensure all are closed properly even if an error occurs. Which approach using defer is best?
func openFiles() {
    f1, _ := os.Open("file1.txt")
    f2, _ := os.Open("file2.txt")
    // What is the best way to defer closing these files?
}
hard
A. Use defer only for the last file opened
B. Defer closing both files together at the end of the function
C. Close files manually without defer
D. Defer closing each file immediately after opening it

Solution

  1. Step 1: Understand resource management with defer

    Deferring the close immediately after opening each file ensures each file is closed properly even if the function returns early.
  2. Step 2: Compare options

    Defer closing each file immediately after opening it defers closing right after opening, which is safe. Defer closing both files together at the end of the function delays both closes until the end, risking leaks if errors occur. Close files manually without defer is error-prone. Use defer only for the last file opened misses closing one file.
  3. Final Answer:

    Defer closing each file immediately after opening it -> Option D
  4. Quick Check:

    Defer resource cleanup immediately after acquisition = D [OK]
Hint: Defer cleanup right after resource acquisition [OK]
Common Mistakes:
  • Deferring all closes at once at the end
  • Not deferring close for every opened file
  • Closing files manually without defer
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard