Commit 206fd788 authored by Robert Griesemer's avatar Robert Griesemer

spec: be more precise about the moment deferred functions are executed

Fixes #27802.

Change-Id: I7ea9f7279300a55b0cb851893edc591a6f84e324
Reviewed-on: https://go-review.googlesource.com/136758Reviewed-by: default avatarRob Pike <r@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent c5a8d1d2
<!--{ <!--{
"Title": "The Go Programming Language Specification", "Title": "The Go Programming Language Specification",
"Subtitle": "Version of August 30, 2018", "Subtitle": "Version of September 24, 2018",
"Path": "/ref/spec" "Path": "/ref/spec"
}--> }-->
...@@ -5546,7 +5546,10 @@ executes, the function value and parameters to the call are ...@@ -5546,7 +5546,10 @@ executes, the function value and parameters to the call are
and saved anew but the actual function is not invoked. and saved anew but the actual function is not invoked.
Instead, deferred functions are invoked immediately before Instead, deferred functions are invoked immediately before
the surrounding function returns, in the reverse order the surrounding function returns, in the reverse order
they were deferred. they were deferred. That is, if the surrounding function
returns through an explicit <a href="#Return_statements">return statement</a>,
deferred functions are executed <i>after</i> any result parameters are set
by that return statement but <i>before</i> the function returns to its caller.
If a deferred function value evaluates If a deferred function value evaluates
to <code>nil</code>, execution <a href="#Handling_panics">panics</a> to <code>nil</code>, execution <a href="#Handling_panics">panics</a>
when the function is invoked, not when the "defer" statement is executed. when the function is invoked, not when the "defer" statement is executed.
...@@ -5572,12 +5575,13 @@ for i := 0; i &lt;= 3; i++ { ...@@ -5572,12 +5575,13 @@ for i := 0; i &lt;= 3; i++ {
defer fmt.Print(i) defer fmt.Print(i)
} }
// f returns 1 // f returns 42
func f() (result int) { func f() (result int) {
defer func() { defer func() {
result++ // result is accessed after it was set to 6 by the return statement
result *= 7
}() }()
return 0 return 6
} }
</pre> </pre>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment