Recover usage in Go - Time & Space Complexity
When using recover in Go, we want to know how it affects the program's speed.
We ask: does calling recover change how long the program takes as input grows?
Analyze the time complexity of the following code snippet.
func safeDivide(nums []int, divisor int) []int {
results := []int{}
for _, num := range nums {
func() {
defer func() {
if r := recover(); r != nil {
// handle division by zero
}
}()
results = append(results, num/divisor)
}()
}
return results
}
This code divides each number in a list by a divisor, using recover to handle any division by zero errors safely.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each number in the input slice.
- How many times: Once for each element in the input slice.
As the input list gets bigger, the number of divisions and recover checks grows at the same pace.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 divisions and recover checks |
| 100 | About 100 divisions and recover checks |
| 1000 | About 1000 divisions and recover checks |
Pattern observation: The work grows directly with the number of items; doubling input doubles work.
Time Complexity: O(n)
This means the time to run grows in a straight line with the input size.
[X] Wrong: "Using recover inside the loop makes the code run slower exponentially."
[OK] Correct: Recover only runs when a panic happens, and the loop still runs once per item, so the time grows linearly, not exponentially.
Understanding how recover affects time helps you write safe Go code without worrying about hidden slowdowns as your data grows.
What if we moved the recover call outside the loop? How would the time complexity change?
Practice
recover function in Go?Solution
Step 1: Understand panic and recover
Panic causes a program to stop immediately unless recovered.Step 2: Role of recover
Recover catches the panic inside a deferred function to keep the program running.Final Answer:
To catch a panic and prevent the program from crashing -> Option DQuick Check:
recover catches panic = A [OK]
- Thinking recover handles normal errors
- Using recover outside deferred functions
- Confusing recover with panic
recover in Go?Solution
Step 1: Identify recover usage rules
Recover must be called inside a deferred function to catch panics.Step 2: Analyze options
Only Call recover inside a deferred function calls recover inside a deferred function.Final Answer:
Call recover inside a deferred function -> Option BQuick Check:
recover inside defer = B [OK]
- Calling recover directly without defer
- Calling recover after panic ends
- Using recover in goroutines without defer
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
panic("something went wrong")
fmt.Println("This will not print")
}Solution
Step 1: Understand defer and recover behavior
The deferred function runs after panic starts, calling recover to catch it.Step 2: Output analysis
Recover prints the panic message, so output is "Recovered from panic: something went wrong".Final Answer:
Recovered from panic: something went wrong -> Option AQuick Check:
defer + recover prints panic message = C [OK]
- Expecting code after panic to run
- Thinking panic message prints directly
- Ignoring deferred recover function
func main() {
recover()
panic("error")
}Solution
Step 1: Check recover usage
Recover only works inside deferred functions to catch panics.Step 2: Analyze code
Recover is called directly, so it won't catch the panic, causing program to crash.Final Answer:
recover() is called outside a deferred function and will not catch panic -> Option CQuick Check:
recover outside defer = no panic catch = D [OK]
- Calling recover directly without defer
- Assuming recover catches panic anytime
- Misunderstanding panic and recover order
recover to avoid crashing when dividing by zero?Solution
Step 1: Identify correct recover usage
Recover must be called inside a deferred anonymous function to catch panics.Step 2: Analyze options
Only func safeDivide(a, b int) int { defer func() { if r := recover(); r != nil { fmt.Println("Recovered from panic") } }() return a / b } uses defer with an anonymous function calling recover properly.Final Answer:
func safeDivide(a, b int) int { defer func() { if r := recover(); r != nil { fmt.Println("Recovered from panic") } }() return a / b } -> Option AQuick Check:
defer func with recover = safe panic handling = A [OK]
- Calling recover without defer
- Calling recover outside anonymous function
- Placing defer after return statement
Ready to prove it?
Pass the test and this pattern moves unknown
