golang报错的常见问题数组越界与解决方法: panic: runtime error: index out of range [0] with length 0 goroutine 1 [running]:
go语言出现数组越界的情况:
- 一维数组越界:常出现于for循环,在通过len()计算数组长度时
此处的i-1中,没有确定好边缘值/特殊值出现错误
- for i:=0;i<len(array);i++{
- if array[i-1]<array[i]{....} //此处的i-1中,没有确定好边缘值/特殊值出现错误
- }
- 多维数组越界
多维数组越界,不仅会有前面一维数组的错误外,还存在着一下两种错误:
第一种:
panic: runtime error: index out of range [0] with length 0 goroutine 1 [running]:
a :=make([][]int ,4)
a[0][0]=1
fmt.Println(a[0][0])
解决方法:
在第一句后添加
for i:=0;i<4;i++{
a[i]=make([]int,4)
}
即:
a :=make([][]int ,4)
for i:=0;i<4;i++{
a[i]=make([]int,4)
}
a[0][0]=1
fmt.Println(a[0][0])
原因,go语言的空间机制,没有给一维切片赋值,故为了节约空间,减少空间资源的浪费而造成的,其中的4只是个例子
第二种:
fatal error: out of memory
runtime stack:
runt ime. throw (0x4f8f1d, 0xd)
panic. go,line 774
runtime. largeAlloc (0x32ca0,0x450101, 0xc03ffae000)
malloc. go,line 1140
runtime. mallocgc. func1 (
malloc. go, line 1033
runtime. systemstack (0x452ca4)
/usr/ local/go/ src/runtime/asm_ amd64. s:370 +0x66
runtime. mstart()
proc. go,line 1146
runt ime. systemstack_ switch()
/usr/ local/ go/ src/runt ime/asm_ amd64. s:330 fp=0xc000060c30 sp=0xc000060c28 pc=0x452da0
runtime. mallocgc (0x32ca0,0x4ce820, 0x454c01, 0xc03ffae000)
malloc. go,line 1032
runtime. makeslice (0x4ce820,0x6594, 0x6594, 0xc03ffae000)
slice. go,line 49
main. maxProfit (0xc000946000,0x6594, 0x6aae, 0x4c8940)
solution. go,line 38
main._ helper_ (… )
solution. go, line 59
main. main()
solution. go, line 87
runtime. main()
proc. go,line 203
runtime. goexit()
/usr/1ocal/ go/src/runtime/asm_ amd64. s:1357 +0x1 fp=0xc000060fe8 sp=0xc000060fe0 pc=0x454cf1
runtime: out of memory: cannot allocate 212992-byte block (1073479680 in use)
简单概述就是,资源调用过大,一般是刷题/测试,或者编辑器资源分配不够时出现的情况(一般都是自己问题)
这里需要自己调整,该多维数组,是否是内存使用过度的问题,问题多出现在for循环内,多为以下情况
for i:=0;i<len(a);i++{
a[i]=make([]int,len(a))
}
这语句没问题,但是可能数组a过长,而建立的二维数组过大导致的,一般将创建的二维数组这语句改为一个确切的(比较小的)值即可
如
for i:=0;i<len(a);i++{
a[i]=make([]int,4))
}