接受任意大小数组作为参数的函数(在 Golang 中可能吗?)
Function which accepts array of arbitrary size as argument (is it possible in Golang?)
问:在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,passes/uses 东西 'by value',使用数组可能有点矫枉过正,因为 golang 会复制他们很多次。我想我会继续使用切片,我会试着稍微了解一下 GOB 的内部结构。
没有。 Go 不支持泛型。
唯一的方法是使用 interface{}
,但这将允许传递任何类型的值,而不仅仅是所需类型的数组。
Go 中的数组是 "secondary"。解决方案是根据您的要求使用切片。
这里需要注意的一点是,你可以继续使用数组,只有在你想将它们传递给这个函数时才对它们进行切片,例如:
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]
问:在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,passes/uses 东西 'by value',使用数组可能有点矫枉过正,因为 golang 会复制他们很多次。我想我会继续使用切片,我会试着稍微了解一下 GOB 的内部结构。
没有。 Go 不支持泛型。
唯一的方法是使用 interface{}
,但这将允许传递任何类型的值,而不仅仅是所需类型的数组。
Go 中的数组是 "secondary"。解决方案是根据您的要求使用切片。
这里需要注意的一点是,你可以继续使用数组,只有在你想将它们传递给这个函数时才对它们进行切片,例如:
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]