gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:16:20 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com