规范中对此进行了介绍:将参数传递给…
parameters:
如果
f为带有最终p类型为type的可变参数...T,则f类型内p等于type[]T。…
如果最终参数可分配给切片类型
[]T,...T则在参数后跟时可以将其作为参数的值原样传递...。在这种情况下,不会创建新的切片。
因此,在短期:
这是一个编译时错误,因为
sliceOfSlices(这是类型的
[][]interface{})不能被分配到args(这是类型
[]interface{})(上游乐场证明)。总而言之:
在第一个示例中,当您执行时
unpack(slice),由于
unpack()期望的值
interface{},因此slice(类型为
[]interface{})将被包装为新
interface{}值,并将其作为 单个 参数传递。完成后
unpack(slice...),这会将所有的值
slice作为单独的值传递给
unpack();;
这是可能的,因为的类型
slice为
[]interface{},它与可变参数(args ...interface{})的类型匹配。在第二个示例中,当您执行
unpack(sliceOfSlices)时,
sliceOfSlices将再次包装在 新
interface{}值中并作为 单个 参数传递。但是,当您尝试
unpack(sliceOfSlices...)时,可能希望将的每个元素传递
sliceOfSlices给
unpack(),但
sliceOfSlices(
[][]interface{}的类型)与可变参数的类型不匹配,因此会产生编译时错误。传递
sliceOfSlices给
unpack()“爆炸”
的唯一方法是创建一个新切片,其类型必须为
[]interface{},复制元素,然后可以使用传递它...。
例:
var sliceOfSlices2 []interface{}for _, v := range sliceOfSlices { sliceOfSlices2 = append(sliceOfSlices2, v)}unpack(sliceOfSlices2...)在Go Playground上尝试一下。
让我们使用以下
unpack()函数来验证参数数量:
func unpack(args ...interface{}) { fmt.Println(len(args))}运行您的示例(以及我的新切片创建),输出为:
1312
事实证明,
...不仅传递了一个参数(用包裹
interface{}),而且使用...所有元素都将分别传递。
在Go Playground上尝试此测试。



