Closure Capture in Golang's Defer Statement
Golang's defer statement allows for cleanup actions to be executed after a function returns. However, unlike most languages, the closure created by defer does not capture the current state of the variables in the surrounding function, but instead evaluates them when the defer statement executes.
Understanding Part 2 vs. Part 3
In the given code, the difference between Part 2 and Part 3 lies in how the closure captures the variable i.
Part 2:
for i := range whatever { defer func() { fmt.Println(i) }() }
In Part 2, the closure captures the variable i directly. When the code in the closure executes (after the loop has finished), the value of i is determined by the final iteration of the loop, which is 4. This is why Part 2 outputs "44444."
Part 3:
for i := range whatever { defer func(n int) { fmt.Println(n) }(i) }
In Part 3, the closure does not capture i directly, but instead creates a new variable n and assigns it the value of i at the time the defer statement executes. Since the defer statement executes for each iteration of the loop, each closure has a different value for n. This results in the output "43210."
Key Point:
The key concept to remember is that the code within the closure in defer is not executed when the defer statement is executed. Instead, the expressions used to determine the closure's arguments (e.g., i in this case) are evaluated when the defer statement executes.
The above is the detailed content of How Does Golang's Defer Statement Capture Variables in a Loop?. For more information, please follow other related articles on the PHP Chinese website!