summaryrefslogtreecommitdiff
path: root/doc/go_spec.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/go_spec.html')
-rw-r--r--doc/go_spec.html81
1 files changed, 21 insertions, 60 deletions
diff --git a/doc/go_spec.html b/doc/go_spec.html
index e2637d96c..589d90458 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -986,7 +986,7 @@ Signature = Parameters [ Result ] .
Result = Parameters | Type .
Parameters = "(" [ ParameterList [ "," ] ] ")" .
ParameterList = ParameterDecl { "," ParameterDecl } .
-ParameterDecl = [ IdentifierList ] ( Type | "..." [ Type ] ) .
+ParameterDecl = [ IdentifierList ] [ "..." ] Type .
</pre>
<p>
@@ -998,23 +998,22 @@ lists are always parenthesized except that if there is exactly
one unnamed result it may written as an unparenthesized type.
</p>
<p>
-For the last parameter only, instead of a type one may write
-<code>...</code> or <code>... T</code> to indicate that the function
-may be invoked with zero or more additional arguments. If the type
-<code>T</code> is present in the parameter declaration, the additional
-arguments must all be <a href="#Assignability">assignable</a>
-to <code>T</code>; otherwise they may be of any type.
+If the function's last parameter has a type prefixed with <code>...</code>,
+the function may be invoked with zero or more arguments for that parameter,
+each of which must be <a href="#Assignability">assignable</a>
+to the type that follows the <code>...</code>.
+Such a function is called <i>variadic</i>.
+
</p>
<pre>
func()
func(x int)
func() int
-func(string, float, ...)
-func(prefix string, values ... int)
+func(prefix string, values ...int)
func(a, b int, z float) bool
func(a, b int, z float) (bool)
-func(a, b int, z float, opt ...) (success bool)
+func(a, b int, z float, opt ...interface{}) (success bool)
func(int, int, float) (float, *[]int)
func(n int) func(p *T)
</pre>
@@ -1271,10 +1270,8 @@ literal structure and corresponding components have identical types. In detail:
<li>Two pointer types are identical if they have identical base types.</li>
<li>Two function types are identical if they have the same number of parameters
- and result values and if corresponding parameter and result types are
- identical. All "..." parameters without a specified type are defined to have
- identical type. All "..." parameters with specified identical type
- <code>T</code> are defined to have identical type.
+ and result values, corresponding parameter and result types are
+ identical, and either both functions are variadic or neither is.
Parameter and result names are not required to match.</li>
<li>Two interface types are identical if they have the same set of methods
@@ -2602,48 +2599,13 @@ There is no distinct method type and there are no method literals.
<h3 id="Passing_arguments_to_..._parameters">Passing arguments to <code>...</code> parameters</h3>
<p>
-When a function <code>f</code> has a <code>...</code> parameter,
-it is always the last formal parameter. Within calls to <code>f</code>,
-the arguments before the <code>...</code> are treated normally.
-After those, an arbitrary number (including zero) of trailing
-arguments may appear in the call and are bound to the <code>...</code>
-parameter.
-</p>
-
-<p>
-Within <code>f</code>, a <code>...</code> parameter with no
-specified type has static type <code>interface{}</code> (the empty
-interface). For each call, its dynamic type is a structure whose
-sequential fields are the trailing arguments of the call. That is,
-the actual arguments provided for a <code>...</code> parameter are
-wrapped into a struct that is passed to the function instead of the
-actual arguments. Using the <a href="#Package_unsafe">reflection</a>
-interface, <code>f</code> may unpack the elements of the dynamic
-type to recover the actual arguments.
-</p>
-
-<p>
-Given the function and call
-</p>
-<pre>
-func Fprintf(f io.Writer, format string, args ...)
-Fprintf(os.Stdout, "%s %d", "hello", 23)
-</pre>
-
-<p>
-Within <code>Fprintf</code>, the dynamic type of <code>args</code> for this
-call will be, schematically,
-<code> struct { string; int }</code>.
-</p>
-
-<p>
-If the final parameter of <code>f</code> has type <code>... T</code>,
-within the function it is equivalent to a parameter of type
-<code>[]T</code>. At each call of <code>f</code>, the actual
-arguments provided for the <code>... T</code> parameter are placed
-into a new slice of type <code>[]T</code> whose successive elements are
+If <code>f</code> is variadic with final parameter type <code>...T</code>,
+then within the function the argument is equivalent to a parameter of type
+<code>[]T</code>. At each call of <code>f</code>, the argument
+passed to the final parameter is
+a new slice of type <code>[]T</code> whose successive elements are
the actual arguments. The length of the slice is therefore the
-number of arguments bound to the <code>... T</code> parameter and
+number of arguments bound to the final parameter and
may differ for each call site.
</p>
@@ -2662,11 +2624,10 @@ Within <code>Greeting</code>, <code>who</code> will have value
<p>
-As a special case, if a function passes its own <code>...</code> parameter,
-with or without specified type, as the argument
-for a <code>...</code> in a call to another function with a <code>...</code> parameter
-of <a href="#Type_identity">identical type</a>,
-the parameter is not wrapped again but passed directly. In short, a formal <code>...</code>
+As a special case, if a function passes its own <code>...</code> parameter
+as the <code>...</code> argument in a call to another function with
+a <code>...</code> parameter of <a href="#Type_identity">identical type</a>,
+the parameter is passed directly. In short, a formal <code>...</code>
parameter is passed unchanged as an actual <code>...</code> parameter provided the
types match.
</p>