【问题标题】:Go - Passing an array to a function receiving argument listGo - 将数组传递给接收参数列表的函数
【发布时间】:2014-11-24 02:26:51
【问题描述】:

如何在 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

这个:

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

会产生错误。

我知道我可以创建一个新的接口数组并一个一个地分配值来解决这个问题,但是有没有一种优雅的方法来做到这一点?

【问题讨论】:

    标签: function go interface parameter-passing


    【解决方案1】:

    从整数数组转换为 interface{} 切片没有优雅的捷径。你需要编写for循环。

    电话

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

    无法编译,因为整数数组和 interface{} 切片是不同的类型。您可以使用[:] 在数组上轻松创建切片:

    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 我认为它完美地回答了这个问题。 interface{} 的可变参数与 Go 中 int 的可变参数不同,这只是语言的设计方式。 Go 不支持将泛型作为设计选择,因此这是您目前拥有的最好的。如果你想自动扩展一个数组或切片成一个可变参数,它们必须是相同的类型,这意味着你必须手动拆箱并重新装箱。
    • @JasonCoco - 他编辑了他的答案。我回复了他的原文。
    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 2020-04-15
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多