Unpacking slice of slices
我对解包一片切片并将其作为变量函数的参数发送感到好奇。
假设我们有一个带有可变参数的函数:
1 | func unpack(args ...interface{}) |
如果我们不在一个接口片中传递它的工作状态,那么不管我们是否解包它:
1 2 3 | slice := []interface{}{1,2,3} unpack(slice) // works unpack(slice...) // works |
号
如果我们有一片切片会很棘手。在这里,编译器不允许我们传递未打包的版本:
1 2 3 4 5 6 | sliceOfSlices := [][]interface{}{ []interface{}{1,2}, []interface{}{101,102}, } unpack(sliceOfSlices) // works unpack(sliceOfSlices...) // compiler error |
错误显示:
cannot use sliceOfSlices (type [][]interface {}) as type []interface {} in argument to unpack
号
我不知道为什么会发生这种情况,因为我们可以清楚地将
操场示例:https://play.golang.org/p/o3ayba8h4i
规范中包含了这一点:将参数传递给…参数:
If
f is variadic with a final parameterp of type...T , then withinf the type ofp is equivalent to type[]T ....
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.
号
简而言之:这是一个编译时错误,因为
长:
在您的第一个示例中,当您执行
当您执行
在您的第二个示例中,当您执行
但是,当您尝试
将
例子:
1 2 3 4 5 6 | var sliceOfSlices2 []interface{} for _, v := range sliceOfSlices { sliceOfSlices2 = append(sliceOfSlices2, v) } unpack(sliceOfSlices2...) |
在运动场上试试。
让我们使用下面的
1 2 3 | func unpack(args ...interface{}) { fmt.Println(len(args)) } |
号
运行您的示例(使用我的新切片创建),输出为:
1 2 3 4 | 1 3 1 2 |
没有
在游乐场上试试这个测试。