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) { 

} 

如果这就是你是什么东西通过。

+2

正如我写的,“我知道我可以创建一个新的接口数组并分配值”,但这并不回答我关于i ... interface函数签名的问题,这可能意味着让更多的灵活性? – Ronna 2014-09-29 16:16:20

+0

@我觉得它完美地回答了这个问题。 “接口{}”的可变参数与Go中的“int”的可变参数不同,它只是语言设计的方式。 Go不支持泛型作为设计选择,所以这是你现在最好的。如果你想自动扩展一个数组或切片成可变参数,它们必须是相同的类型,这意味着你必须手动取消并重新打包它。 – 2014-09-30 01:57:28

+0

@JasonCoco - 他编辑了他的答案。我回复了他的原文。 – Ronna 2014-09-30 08:35:58