]> Cypherpunks repositories - gostls13.git/commitdiff
spec: be more precise about the moment deferred functions are executed
authorRobert Griesemer <gri@golang.org>
Sat, 22 Sep 2018 04:03:35 +0000 (21:03 -0700)
committerRobert Griesemer <gri@golang.org>
Mon, 24 Sep 2018 21:15:27 +0000 (21:15 +0000)
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>
doc/go_spec.html

index 57bb3b53f581d94980d9bc85b4a3d83624e8016d..32336e86f866dd8f0b8c4d470c974c5624c73caa 100644 (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>