1
0
mirror of https://github.com/golang/go synced 2024-09-23 21:20:13 -06:00

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

Fixes #27802.

Change-Id: I7ea9f7279300a55b0cb851893edc591a6f84e324
Reviewed-on: https://go-review.googlesource.com/136758
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Robert Griesemer 2018-09-21 21:03:35 -07:00
parent c5a8d1d2f9
commit 206fd7886b

View File

@ -1,6 +1,6 @@
<!--{
"Title": "The Go Programming Language Specification",
"Subtitle": "Version of August 30, 2018",
"Subtitle": "Version of September 24, 2018",
"Path": "/ref/spec"
}-->
@ -5546,7 +5546,10 @@ executes, the function value and parameters to the call are
and saved anew but the actual function is not invoked.
Instead, deferred functions are invoked immediately before
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
to <code>nil</code>, execution <a href="#Handling_panics">panics</a>
when the function is invoked, not when the "defer" statement is executed.
@ -5572,12 +5575,13 @@ for i := 0; i &lt;= 3; i++ {
defer fmt.Print(i)
}
// f returns 1
// f returns 42
func f() (result int) {
defer func() {
result++
// result is accessed after it was set to 6 by the return statement
result *= 7
}()
return 0
return 6
}
</pre>