接受任意大小的数组作为参数的函数(在Golang中可以吗?)

时间:2018-05-16 11:55:43

标签: arrays go arguments slice gob

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

例如,

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

我已经理解在golang中,数组长度是变量类型的一部分,因此以下函数不会接受任意数组作为输入

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

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

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

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

即,demoSlice(arrInput)无法编译,期望切片不是数组。

问题是,有没有办法定义一个采用任意长度数组的函数(数组,非切片)?它看起来很奇怪并限制了一种语言强加这种约束。

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

此致

P.s:我现在提醒一下Go,传递/使用'按值',使用数组可能会有点过分,因为golang会复制很多次。我认为我会留下片,我会尝试理解GOB内部。

1 个答案:

答案 0 :(得分:6)

没有。 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]