给定(可变)函数
的原因是什么?func varargs(n ...int) {}
它可以被称为
varargs(1, 2, 3, 4) // Fixed number of arguments
但不包含 array :
a := [4]int{1, 2, 3, 4} // Fixed number of elements
varargs(a...) // Error: cannot use (type [4]int) as type []int in argument
我明白为什么
var s []int = a
不起作用:它可以防止意外误用,需要手动切片:
s := a[:]
但是为什么该限制扩展到对可变参数函数的调用?
奖金问题:
相反,为什么要打电话
func fourargs(w, x, y, z int) {}
具有 4元素数组
fourargs(a...) // Error: not enough arguments in call have ([4]int...)
// want (int, int, int, int)
也被禁止吗?
可以在编译时进行类型检查。
答案 0 :(得分:6)
Spec: Passing arguments to ... parameters:
如果最终参数可分配给切片类型
[]T
,则如果参数后面跟着{{ 1}}。在这种情况下,不会创建新的切片。
因此,当您有一个切片并将其作为可变参数的值传递时,不会创建新的切片,而只是为其分配。
如果您有一个数组,那是另一个类型,则不能分配给切片类型。因此,这是不允许的。
您必须首先对数组进行切片,而无需中间变量就可以做到:
...T
是的,您可以说这种自动切片可以自动/内部进行。为什么不允许这样做是基于意见的(属于Go的作者)。基本上,在Go中数组是次要的。切片是路要走。首先,您应该有一个切片,可以通过,并且没有问题。查看相关问题:Why have arrays in Go?和Slicing a slice pointer passed as argument。