Go - 将数组传递给接收参数列表的函数
问题描述:
如何将数组作为接口{}参数列表传入?Go - 将数组传递给接收参数列表的函数
func Yalla(i...interface{}) {
fmt.Println(i)
}
func main() {
Yalla(1,2,3)
Yalla([...]int{1,2,3})
}
将输出:
[1 2 3] //good
[[1 2 3]] //bad
此:
Yalla([...]int{1,2,3}...)
将产生错误:
cannot use [3]int literal (type [3]int) as type []interface {} in argument to Yalla
我知道我可以做一个新的接口阵列和分配值一个一个解决这个问题,但我有没有一种优雅的方式来做到这一点?
答
从整数数组转换为接口片没有优雅的快捷方式。你需要编写for循环。
呼叫
Yalla([...]int{1,2,3}...)
不编译,因为整数数组和接口{}的切片是不同的类型。您可以轻松地使用[:]
在阵列上创建一个切片:
Yalla([...]int{1,2,3}[:]...)
但由于整数片及接口{}一片不同类型as explained in the FAQ这并不能解决问题。
您可能需要的值复制为shown in the FAQ,开始与接口{}
Yalla([]interface{}{1,2,3}...)
的切片或改变一个可变的参数类型为int
func Yalla(i ...int) {
}
如果这就是你是什么东西通过。
正如我写的,“我知道我可以创建一个新的接口数组并分配值”,但这并不回答我关于i ... interface函数签名的问题,这可能意味着让更多的灵活性? – Ronna 2014-09-29 16:16:20
@我觉得它完美地回答了这个问题。 “接口{}”的可变参数与Go中的“int”的可变参数不同,它只是语言设计的方式。 Go不支持泛型作为设计选择,所以这是你现在最好的。如果你想自动扩展一个数组或切片成可变参数,它们必须是相同的类型,这意味着你必须手动取消并重新打包它。 – 2014-09-30 01:57:28
@JasonCoco - 他编辑了他的答案。我回复了他的原文。 – Ronna 2014-09-30 08:35:58