一尘不染

为什么切片长度大于容量长度会导致运行时错误?

go

切成容量小于长度的切片

    包主

    导入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

我的问题是容量可以小于长度吗?

如果是,那么为什么会出现此错误?
如果为“否”,那么为什么这是运行时错误,为什么不是编译时?


阅读 280

收藏
2020-07-02

共1个答案

一尘不染

不可以,容量不能少于长度。

切片是对数组一部分的引用。切片的容量代表该后备阵列的大小。如果其长度大于其容量,则使用什么内存?

以下不变量始终对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的值。

2020-07-02