Go - 将数组传递给接收参数列表的函数

3

我该如何在Go语言中将一个数组作为interface{}参数列表传递?

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

This:

Yalla([]int{1,2,3}...)

将会生成错误。

我知道我可以创建一个新的接口数组,并逐个赋值来解决这个问题,但有没有更优雅的方法呢?

1个回答

6
没有从整数数组转换为interface{}切片的简洁方法。您需要编写for循环来完成此操作。
调用:
Yalla([...]int{1,2,3}...)

由于整数数组和接口类型的切片是不同的类型,所以无法编译。您可以使用 [:] 轻松地在数组上创建一个切片:

Yalla([...]int{1,2,3}[:]...)

但是这并不能解决问题,因为整数切片和接口{}切片是不同的类型,正如FAQ中所解释的
你需要按照FAQ中所示,将值复制到接口{}切片中,或者从接口{}切片开始。
Yalla([]interface{}{1,2,3}...)

或者将可变参数类型更改为 int

func Yalla(i ...int) {

}

如果这是你一直在传递的内容。

2
就像我写的那样,“我知道我可以创建一个新的接口数组,并逐个赋值”,但这并没有回答我的关于i...interface{}函数签名的问题,也许它的目的是为了提供更大的灵活性? - undefined
@Ronna 我觉得这完美地回答了问题。在Go语言中,interface{}的可变参数与int的可变参数是不同的,这只是语言设计的方式。由于Go语言选择不支持泛型,所以目前这是你唯一的选择。如果你想要将数组或切片自动展开为可变参数,它们必须是相同的类型,这意味着你需要手动拆箱和重新封装。 - undefined
@JasonCoco - 他编辑了他的回答。我回复了他原来的文字。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接