How Does Golang's Defer Statement Capture Variables in a Loop?

DDD
Release: 2024-11-11 22:13:02
Original
333 people have browsed it

How Does Golang's Defer Statement Capture Variables in a Loop?

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) }()
}
Copy after login

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)
}
Copy after login

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template