go - 为什么 slice 长度大于容量会导致运行时错误?

标签 go

制作容量小于长度的 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/

相关文章:

connection - 如何在 go 中设计连接器

go - Go 语言的 Cassandra 数据存储客户端

windows - golang.org/x/sys/windows/registry (k Key)ReadSubKeyNames() 返回空 slice

go - 从同一文件系统中的不同存储库导入 Go 模块

go - 访问结构中嵌入 slice 的值

docker - 无法连接到在本地 Docker 容器中运行的 Go GRPC 服务器

go - 追加时数组大小不加倍

mysql - 在 Go 中使用查询参数获取记录

postgresql - 建议的 Golang 架构,用于频繁轮询用户帐户

go - 使用 Shopify Sarama 的 Kafka 错误处理