切成容量小于长度的切片
包主 导入fmt“ fmt” func main(){ 输入b [] int var k = make([] b,10,5) fmt.Printf(“%d \ n”,k [8]) }
尝试运行时会出现以下错误。
紧急:运行时错误:makeslice:上限超出范围 runtime.panic + 0x9e /go/src/pkg/runtime/proc.c:1060 runtime.panic(0x453b00,0x30020390) runtime.panicstring + 0x94 /go/src/pkg/runtime/runtime.c:116 runtime.panicstring(0x4afd6c,0x40d80c) runtime.makeslice + 0x70 /go/src/pkg/runtime/slice.c:24 runtime.makeslice(0x44302c,0xa,0x0,0x5,0x0,...) main.main + 0x45 C:/GOEXCE~1/basics/DATATY~1/slice.go:8 main.main() runtime.mainstart + 0xf 386 / asm.s:93 runtime.mainstart() runtime.goexit /go/src/pkg/runtime/proc.c:178 runtime.goexit() ----- goroutine由-----创建 _rt0_386 + 0xbf 386 / asm.s:80
我的问题是容量可以小于长度吗?
如果是,那么为什么会出现此错误? 如果为“否”,那么为什么这是运行时错误,为什么不是编译时?
不可以,容量不能少于长度。
切片是对数组一部分的引用。切片的容量代表该后备阵列的大小。如果其长度大于其容量,则使用什么内存?
以下不变量始终对slice s有效(除非您做了不安全的操作):
0 <= len(s) <= cap(s)
您的代码会产生运行时错误,而不是编译时错误,因为该错误无法始终被静态检测到。在您的情况下可以,但是请考虑以下代码:
package main import ( "fmt" "rand" ) func main() { k := make([]int, rand.Int(), rand.Int()) fmt.Println(k) }
直到运行时才能知道传递给make的值。