为什么在Go中调用可变参数函数时不能_direct_使用数组?

ᆼᆺᆼ*_*ᆼᆺᆼ -2 arrays variadic-functions go slice

给定(可变)函数的原因是什么

func varargs(n ...int) {}
Run Code Online (Sandbox Code Playgroud)

可以这样称呼

varargs(1, 2, 3, 4) // Fixed number of arguments
Run Code Online (Sandbox Code Playgroud)

但不包含数组

a := [4]int{1, 2, 3, 4} // Fixed number of elements
varargs(a...) // Error: cannot use (type [4]int) as type []int in argument
Run Code Online (Sandbox Code Playgroud)

我明白为什么

var s []int = a
Run Code Online (Sandbox Code Playgroud)

无效:它可以防止意外误用,需要手动切片:

s := a[:]
Run Code Online (Sandbox Code Playgroud)

但是,为什么此限制扩展到对可变参数函数的调用?


额外的问题:
相反,为什么会打电话

func fourargs(w, x, y, z int) {}
Run Code Online (Sandbox Code Playgroud)

4个元素的数组

fourargs(a...) // Error: not enough arguments in call  have ([4]int...)  
               //                                      want (int, int, int, int)
Run Code Online (Sandbox Code Playgroud)

也被禁止?
可以在编译时进行类型检查。

icz*_*cza 6

规格:将参数传递给...参数:

如果最终参数可分配给切片类型[]T...T则在参数后跟时可以将其作为参数的值原样传递...。在这种情况下,不会创建新的切片。

因此,当您有一个切片并将其作为可变参数的值传递时,不会创建任何新切片,而是对其进行分配。

如果您有一个数组,那是另一种类型,则不能分配给切片类型。因此,这是不允许的。

您必须首先对数组进行切片,而无需中间变量即可执行此操作:

a := [4]int{1, 2, 3, 4}
varargs(a[:]...)
Run Code Online (Sandbox Code Playgroud)

是的,您可以说这种自动切片可以自动/内部进行。为什么不允许这样做是基于意见的(属于Go的作者)。基本上,在Go中数组是次要的。切片是路要走。首先,您应该有一个切片,可以通过,并且没有问题。查看相关问题:为什么Go中有数组?切片作为参数传递的切片指针