mirror of
https://github.com/golang/go
synced 2024-11-21 22:44:40 -07:00
spec: function invocation, panic on *nil
Document that indirection through a nil pointer will panic. Explain function invocation. This section will need more work, but it's a start. Fixes #1865. Fixes #2252. R=rsc, iant, r CC=golang-dev https://golang.org/cl/5532114
This commit is contained in:
parent
fcfed1479e
commit
633a2ce096
@ -1,6 +1,6 @@
|
|||||||
<!--{
|
<!--{
|
||||||
"Title": "The Go Programming Language Specification",
|
"Title": "The Go Programming Language Specification",
|
||||||
"Subtitle": "Version of January 13, 2012"
|
"Subtitle": "Version of January 21, 2012"
|
||||||
}-->
|
}-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@ -2108,7 +2108,7 @@ Within a composite literal of array, slice, or map type <code>T</code>,
|
|||||||
elements that are themselves composite literals may elide the respective
|
elements that are themselves composite literals may elide the respective
|
||||||
literal type if it is identical to the element type of <code>T</code>.
|
literal type if it is identical to the element type of <code>T</code>.
|
||||||
Similarly, elements that are addresses of composite literals may elide
|
Similarly, elements that are addresses of composite literals may elide
|
||||||
the <code>&T</code> when the the element type is <code>*T</code>.
|
the <code>&T</code> when the the element type is <code>*T</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
@ -2117,7 +2117,7 @@ the <code>&T</code> when the the element type is <code>*T</code>.
|
|||||||
[...]Point{{1.5, -3.5}, {0, 0}} // same as [...]Point{Point{1.5, -3.5}, Point{0, 0}}
|
[...]Point{{1.5, -3.5}, {0, 0}} // same as [...]Point{Point{1.5, -3.5}, Point{0, 0}}
|
||||||
[][]int{{1, 2, 3}, {4, 5}} // same as [][]int{[]int{1, 2, 3}, []int{4, 5}}
|
[][]int{{1, 2, 3}, {4, 5}} // same as [][]int{[]int{1, 2, 3}, []int{4, 5}}
|
||||||
|
|
||||||
[...]*Point{{1.5, -3.5}, {0, 0}} // same as [...]*Point{&Point{1.5, -3.5}, &Point{0, 0}}
|
[...]*Point{{1.5, -3.5}, {0, 0}} // same as [...]*Point{&Point{1.5, -3.5}, &Point{0, 0}}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -2572,6 +2572,20 @@ var pt *Point
|
|||||||
pt.Scale(3.5) // method call with receiver pt
|
pt.Scale(3.5) // method call with receiver pt
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
In a function call, the function value and arguments are evaluated in
|
||||||
|
<a href="#Order_of_evaluation">the usual order</a>.
|
||||||
|
After they are evaluated, the parameters of the call are passed by value to the function
|
||||||
|
and the called function begins execution.
|
||||||
|
The return parameters of the function are passed by value
|
||||||
|
back to the calling function when the function returns.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Calling a <code>nil</code> function value
|
||||||
|
causes a <a href="#Run_time_panics">run-time panic</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
As a special case, if the return parameters of a function or method
|
As a special case, if the return parameters of a function or method
|
||||||
<code>g</code> are equal in number and individually
|
<code>g</code> are equal in number and individually
|
||||||
@ -3042,6 +3056,8 @@ As an exception to the addressability requirement, <code>x</code> may also be a
|
|||||||
For an operand <code>x</code> of pointer type <code>*T</code>, the pointer
|
For an operand <code>x</code> of pointer type <code>*T</code>, the pointer
|
||||||
indirection <code>*x</code> denotes the value of type <code>T</code> pointed
|
indirection <code>*x</code> denotes the value of type <code>T</code> pointed
|
||||||
to by <code>x</code>.
|
to by <code>x</code>.
|
||||||
|
If <code>x</code> is <code>nil</code>, an attempt to evaluate <code>*x</code>
|
||||||
|
will cause a <a href="#Run_time_panics">run-time panic</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@ -4189,9 +4205,17 @@ GoStmt = "go" Expression .
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The expression must be a call, and
|
The expression must be a call.
|
||||||
|
The function value and parameters are
|
||||||
|
<a href="#Calls">evaluated as usual</a>
|
||||||
|
in the calling goroutine, but
|
||||||
unlike with a regular call, program execution does not wait
|
unlike with a regular call, program execution does not wait
|
||||||
for the invoked function to complete.
|
for the invoked function to complete.
|
||||||
|
Instead, the function begins executing independently
|
||||||
|
in a new goroutine.
|
||||||
|
When the function terminates, its goroutine also terminates.
|
||||||
|
If the function has any return values, they are discarded when the
|
||||||
|
function completes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@ -4359,8 +4383,6 @@ Regardless of how they are declared, all the result values are initialized to th
|
|||||||
<p>
|
<p>
|
||||||
<span class="alert">
|
<span class="alert">
|
||||||
TODO: Define when return is required.<br />
|
TODO: Define when return is required.<br />
|
||||||
TODO: Language about result parameters needs to go into a section on
|
|
||||||
function/method invocation<br />
|
|
||||||
</span>
|
</span>
|
||||||
</p>
|
</p>
|
||||||
-->
|
-->
|
||||||
@ -4493,9 +4515,11 @@ DeferStmt = "defer" Expression .
|
|||||||
<p>
|
<p>
|
||||||
The expression must be a function or method call.
|
The expression must be a function or method call.
|
||||||
Each time the "defer" statement
|
Each time the "defer" statement
|
||||||
executes, the parameters to the function call are evaluated and saved anew but the
|
executes, the function value and parameters to the call are
|
||||||
function is not invoked.
|
<a href="#Calls">evaluated as usual</a>
|
||||||
Deferred function calls are executed in LIFO order
|
and saved anew but the
|
||||||
|
actual function is not invoked.
|
||||||
|
Instead, deferred calls are executed in LIFO order
|
||||||
immediately before the surrounding function returns,
|
immediately before the surrounding function returns,
|
||||||
after the return values, if any, have been evaluated, but before they
|
after the return values, if any, have been evaluated, but before they
|
||||||
are returned to the caller. For instance, if the deferred function is
|
are returned to the caller. For instance, if the deferred function is
|
||||||
@ -4503,6 +4527,8 @@ a <a href="#Function_literals">function literal</a> and the surrounding
|
|||||||
function has <a href="#Function_types">named result parameters</a> that
|
function has <a href="#Function_types">named result parameters</a> that
|
||||||
are in scope within the literal, the deferred function may access and modify
|
are in scope within the literal, the deferred function may access and modify
|
||||||
the result parameters before they are returned.
|
the result parameters before they are returned.
|
||||||
|
If the deferred function has any return values, they are discarded when
|
||||||
|
the function completes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@ -5355,9 +5381,7 @@ A struct or array type has size zero if it contains no fields (or elements, resp
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<span class="alert">
|
|
||||||
<h2 id="Implementation_differences">Implementation differences - TODO</h2>
|
<h2 id="Implementation_differences">Implementation differences - TODO</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li><code>len(a)</code> is only a constant if <code>a</code> is a (qualified) identifier denoting an array or pointer to an array.</li>
|
<li><span class="alert"><code>len(x)</code> is only a constant if <code>x</code> is a (qualified) identifier denoting an array or pointer to an array.</span></li>
|
||||||
</ul>
|
</ul>
|
||||||
</span>
|
|
||||||
|
Loading…
Reference in New Issue
Block a user