From b81065d07f3ab6036f4bc8e5a1fa58464e16fa15 Mon Sep 17 00:00:00 2001
From: Rob Pike
@@ -913,9 +913,12 @@ one unnamed result it may written as an unparenthesized type.
For the last parameter only, instead of a type one may write
-...
to indicate that the function may be invoked with
-zero or more additional arguments of any
-type.
+...
or ... T
to indicate that the function
+may be invoked with zero or more additional arguments. If the type
+T
is present in the parameter declaration, the additional
+arguments must all be
+assignment compatible
+with type T
; otherwise they may be of any type.
@@ -923,6 +926,7 @@ func()
func(x int)
func() int
func(string, float, ...)
+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)
@@ -1189,7 +1193,9 @@ identical types. In detail:
T
are defined to have identical type.
Parameter and result names are not required to match.
-Within f
, the ...
parameter has static
-type interface{}
(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 ...
parameter are wrapped into a struct
-that is passed to the function instead of the actual arguments.
-Using the reflection interface, f
may
-unpack the elements of the dynamic type to recover the actual
-arguments.
+Within f
, a ...
parameter with no
+specified type has static type interface{}
(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 ...
parameter are
+wrapped into a struct that is passed to the function instead of the
+actual arguments. Using the reflection
+interface, f
may unpack the elements of the dynamic
+type to recover the actual arguments.
@@ -2621,12 +2627,40 @@ call will be, schematically,
struct { string; int }
.
+If the final parameter of f
has type ... T
,
+within the function it is equivalent to a parameter of type
+[]T
. At each call of f
, the actual
+arguments provided for the ... T
parameter are placed
+into a new slice of type []T
whose successive elements are
+the actual arguments. The length of the slice is therefore the
+number of arguments bound to the ... T
parameter and
+may differ for each call site.
+
-As a special case, if a function passes its own ...
parameter as the argument
-for a ...
in a call to another function with a ...
parameter,
+Given the function and call
+
+func Greeting(prefix string, who ... string) +Greeting("hello:", "Joe", "Anna", "Eileen") ++ +
+Within Greeting
, who
will have value
+[]string{"Joe", "Anna", "Eileen")
+
+As a special case, if a function passes its own ...
parameter,
+with or without specified type, as the argument
+for a ...
in a call to another function with a ...
parameter
+of identical type,
the parameter is not wrapped again but passed directly. In short, a formal ...
-parameter is passed unchanged as an actual ...
parameter.
+parameter is passed unchanged as an actual ...
parameter provided the
+types match.
+