制作容量小于长度的 slice
package main import fmt "fmt" func main(){ type b []int var k = make([]b, 10, 5) fmt.Printf("%d\n",k[8]) }
尝试运行时出现以下错误。
panic: runtime error: makeslice: cap out of range 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 created by ----- _rt0_386+0xbf 386/asm.s:80
我的问题是容量可以小于长度吗?
如果"is"那么为什么会出现这个错误?
如果“否”,那么为什么这是运行时错误而不是编译时错误?
最佳答案
不可以,容量不能小于长度。
slice 是对数组一部分的引用。 slice 的容量表示该支持数组的大小。如果它的长度大于它的容量,那么它正在使用什么内存?
以下不变量始终适用于 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 的值直到运行时才能知道。
关于go - 为什么 slice 长度大于容量会导致运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7083623/