mirror of
https://github.com/golang/go
synced 2024-11-22 00:34:40 -07:00
go spec: modification of defer statement
R=r, rsc, ken2, iant CC=golang-dev https://golang.org/cl/708041
This commit is contained in:
parent
6b3031beaa
commit
48f0cd2bd5
@ -2996,8 +2996,6 @@ which must be <i>addressable</i>,
|
|||||||
that is, either a variable, pointer indirection, array or slice indexing
|
that is, either a variable, pointer indirection, array or slice indexing
|
||||||
operation,
|
operation,
|
||||||
or a field selector of an addressable struct operand.
|
or a field selector of an addressable struct operand.
|
||||||
A function result variable is not addressable.
|
|
||||||
<!--- (<span class="alert">TODO: remove this restriction.</span>) --->
|
|
||||||
Given an operand of pointer type, the pointer indirection
|
Given an operand of pointer type, the pointer indirection
|
||||||
operator <code>*</code> retrieves the value pointed
|
operator <code>*</code> retrieves the value pointed
|
||||||
to by the operand.
|
to by the operand.
|
||||||
@ -4281,7 +4279,12 @@ executes, the parameters to the function call are evaluated and saved anew but t
|
|||||||
function is not invoked.
|
function is not invoked.
|
||||||
Deferred function calls are executed in LIFO order
|
Deferred function calls are executed in LIFO order
|
||||||
immediately before the surrounding function returns,
|
immediately before the surrounding function returns,
|
||||||
but after the return values, if any, have been evaluated.
|
after the return values, if any, have been evaluated, but before they
|
||||||
|
are returned to the caller. For instance, if the deferred function is
|
||||||
|
a <a href="#Function_literals">function literal<a/> and the surrounding
|
||||||
|
function has <a href="#Function_types">named result parameters</a> that
|
||||||
|
are in scope within the literal, the deferred function may access and modify
|
||||||
|
the result parameters before they are returned.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@ -4292,6 +4295,14 @@ defer unlock(l) // unlocking happens before surrounding function returns
|
|||||||
for i := 0; i <= 3; i++ {
|
for i := 0; i <= 3; i++ {
|
||||||
defer fmt.Print(i)
|
defer fmt.Print(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// f returns 1
|
||||||
|
func f() (result int) {
|
||||||
|
defer func() {
|
||||||
|
result++
|
||||||
|
}()
|
||||||
|
return 0
|
||||||
|
}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2 id="Built-in_functions">Built-in functions</h2>
|
<h2 id="Built-in_functions">Built-in functions</h2>
|
||||||
@ -4928,7 +4939,8 @@ The following minimal alignment properties are guaranteed:
|
|||||||
<h2 id="Implementation_differences"><span class="alert">Implementation differences - TODO</span></h2>
|
<h2 id="Implementation_differences"><span class="alert">Implementation differences - TODO</span></h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li><span class="alert">Implementation does not honor the restriction on goto statements and targets (no intervening declarations).</span></li>
|
<li><span class="alert">Implementation does not honor the restriction on goto statements and targets (no intervening declarations).</span></li>
|
||||||
<li><span class="alert">Method expressions are not implemented.</span></li>
|
<li><span class="alert">Method expressions are partially implemented.</span></li>
|
||||||
<li><span class="alert">The implementation of complex numbers is incomplete.</span></li>
|
|
||||||
<li><span class="alert">Gccgo allows only one init() function per source file.</span></li>
|
<li><span class="alert">Gccgo allows only one init() function per source file.</span></li>
|
||||||
|
<li><span class="alert">Deferred functions cannot access the surrounding function's result parameters.</span></li>
|
||||||
|
<li><span class="alert">Function results are not addressable.</span></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
Loading…
Reference in New Issue
Block a user