golang的"..."备忘
1. 用于数组: 表示长度与元素个数相同.
在golang中数组的长度是类型的一部分,不同长度,不同类型.
2. 用于参数: 用于形参表示可变参数. 用于实参表示直接传递. 具体解释参数见官方文档:
传递可变参数时:
(1) 如果实参后不跟..., 则在底层创建与形参类型相同的slice,然后将实参赋值后传递.
(2) 如果实参后跟..., 则不在底层创建与形参类型相同的slice,而是直接将实参传递给形参.
/ref/spec#Passing_arguments_to_..._parameters
Passing arguments to ...
parameters
If f
is variadic with a final parameter p
of type ...T
, then within f
the type of p
is equivalent to type []T
. If f
is invoked with no actual arguments for p
, the value passed to p
is nil
. Otherwise, the value passed is a new slice of type []T
with a new underlying array whose successive elements are the actual arguments, which all must be assignable to T
. The length and capacity of the slice is therefore the number of arguments bound to p
and may differ for each call site.
Given the function and calls
func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")
within Greeting
, who
will have the value nil
in the first call, and []string{"Joe", "Anna", "Eileen"}
in the second.
If the final argument is assignable to a slice type []T
, it may be passed unchanged as the value for a ...T
parameter if the argument is followed by ...
. In this case no new slice is created.
Given the slice s
and call
s := []string{"James", "Jasmine"}Greeting("goodbye:", s...)
within Greeting
, who
will have the same value as s
with the same underlying array.