【问题标题】:Function which accepts array of arbitrary size as argument (is it possible in Golang?)接受任意大小数组作为参数的函数(在 Golang 中可能吗?)
【发布时间】:2018-10-26 11:21:37
【问题描述】:

问:有没有办法在 golang 中定义一个接受任意长度数组作为参数的函数?

例如,

function demoArrayMagic(arr [magic]int){
....
}

我知道在golang中,数组长度是变量类型的一部分,因此下面的函数不会接受一个任意数组作为输入

function demoArray(arr [2]int){
....
}

此函数不会以arrInput [6]int 作为输入进行编译——即demoArray(arrInput) 将无法编译。

以下接受切片参数的函数也不接受数组作为参数(不同的类型,正如预期的那样):

function demoSlice(arr []int){
....
}

即,demoSlice(arrInput) 无法编译,需要切片而不是数组。

问题是,有没有办法定义一个接受任意长度数组(数组,而不是切片)的函数?一种语言强加这种约束看起来很奇怪和限制。

这个问题的意义与动机无关,但就我而言,背后的原因如下。我有一组函数,它们将[][]int 类型的数据结构作为参数。 我注意到它们的 GOB 序列化比我拥有的其他数据结构慢 10 倍 (MB/s)。我想这可能与切片中的解除引用操作链有关。从切片移动到数组——即定义[10000][128]int 类型的对象——可能会改善情况(我希望如此)。

问候

P.s:我现在提醒一下,Go,通过/使用“按价值”的东西,使用数组可能是矫枉过正,因为 golang 会复制它们很多次。我想我会继续使用切片,我会尝试稍微了解 GOB 的内部结构。

【问题讨论】:

    标签: arrays go arguments slice gob


    【解决方案1】:

    没有。 Go 不支持泛型。

    唯一的方法是使用interface{},但这将允许传递任何类型的值,而不仅仅是所需类型的数组。

    Go 中的数组是“次要的”。解决方案是根据您的要求使用切片。

    这里要注意的一点是,你可以继续使用数组,并且只有在你想将它们传递给这个函数时才对它们进行切片,例如:

    func main() {
        a1 := [1]int{1}
        demo(a1[:])
    
        a2 := [2]int{1, 2}
        demo(a2[:])
    }
    
    func demo(s []int) {
        fmt.Println("Passed:", s)
    }
    

    上面的输出(在Go Playground上试试):

    Passed: [1]
    Passed: [1 2]
    

    【讨论】:

    • 谢谢,我已经成功地使用了切片。我正在寻找另一种方法来完成这项工作。看起来没有..我等待其他回复,以防我点亮你的。问候
    • @FabianoTarlao 请注意,您可以继续使用数组,并且仅在需要将它们传递给此函数时才对它们进行切片。请参阅编辑后的答案。
    • 这可能是一个有趣的观点,我会考虑一下...再次感谢您的宝贵时间
    • 希望这是可能的。切片是通过引用传递的,我想像数组一样通过值传递。现在感觉就像 Java,克隆或删除引用很麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2015-12-24
    • 2012-03-08
    • 2011-04-04
    • 2014-08-23
    相关资源
    最近更新 更多