Fab*_*lao 3 arrays arguments go slice gob
问:在golang中,有没有办法定义一个接受任意长度数组作为参数的函数?
例如,
function demoArrayMagic(arr [magic]int){
....
}
Run Code Online (Sandbox Code Playgroud)
我已经理解在golang中,数组长度是变量类型的一部分,因此以下函数不会接受一个任意数组作为输入
function demoArray(arr [2]int){
....
}
Run Code Online (Sandbox Code Playgroud)
此函数不会arrInput [6]int
作为输入进行编译- 即,demoArray(arrInput)
将无法编译.
此外,接受slice参数的以下函数不接受数组作为参数(不同类型,如预期的那样):
function demoSlice(arr []int){
....
}
Run Code Online (Sandbox Code Playgroud)
即,demoSlice(arrInput)
不编译,期望切片不是数组.
问题是,有没有办法定义一个采用任意长度数组的函数(数组,非切片)?它看起来很奇怪并限制了一种语言强加这种约束.
这个问题与动机无关,但在我看来,背后的原因如下.我有一组函数,它们将类型的数据结构作为参数[][]int
.我注意到它们的GOB序列化比我拥有的其他数据结构慢10倍(MB/s).我想这可能与切片中的derefencing操作链有关.从切片移动到数组 - 即,定义类型的对象 - [10000][128]int
可以改善情况(我希望).
问候
Ps:我现在提醒Go,传递/使用"按值"的东西,使用数组可能是过度杀伤因为golang会复制很多次.我想我会留下切片,我会尝试了解一下GOB的内部结构.
那没有.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)
}
Run Code Online (Sandbox Code Playgroud)
以上输出(在Go Playground上试试):
Passed: [1]
Passed: [1 2]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
138 次 |
最近记录: |