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

7

问:在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)。我想这可能与切片中取消引用操作的链有关。从切片移动到数组——即定义类型为[10000][128]int的对象——可能会改善情况(我希望如此)。

问候

附:我现在提醒一下,Go将事物“按值”传递/使用,使用数组可能过度复杂,因为golang将复制它们很多次。我认为我会继续使用切片,并尝试更好地理解GOB内部。

1个回答

12

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

谢谢,我已经成功地使用了切片。我正在寻找另一种完成任务的方法。看起来没有其他方法了。我会等待其他回复,并在必要时采纳您的建议。祝好。 - Fabiano Tarlao
1
@FabianoTarlao 请注意,您可以继续使用数组,并且仅在需要将它们传递到此函数时才对它们进行切片。请参阅编辑后的答案。 - icza
这可能是一个有趣的观点,我会考虑一下... 再次感谢您花时间。 - Fabiano Tarlao
希望这是可能的... 切片是按引用传递的,我想像数组一样按值传递。现在感觉就像Java一样,克隆或摆脱引用很麻烦。 - JakeTheSnake

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