为什么在Go中调用variadic函数时不能使用_directly_数组?

问题描述 投票:-2回答:1

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

func varargs(n ...int) {}

它可以被称为

varargs(1, 2, 3, 4) // Fixed number of arguments

但不是数组:

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)

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

arrays go slice variadic-functions
1个回答
6
投票

Spec: Passing arguments to ... parameters:

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

因此,当您有一个切片并将其作为variadic参数的值传递时,不会创建新切片,而是仅指定切片。

如果您有一个数组,这是一个不同的类型,不能分配给切片类型。因此不允许这样做。

您必须首先切片数组,您可以在没有中间变量的情况下进行切片:

a := [4]int{1, 2, 3, 4}
varargs(a[:]...)

是的,你可以说这种自动切片可以自动/内部发生。为什么不允许这是基于意见的(并且属于Go的作者)。基本上,在Go数组中是次要的。切片是要走的路。你应该首先有一个切片,你可以通过,你没有问题。查看相关问题:Why have arrays in Go?Slicing a slice pointer passed as argument

© www.soinside.com 2019 - 2024. All rights reserved.