当前位置: 首页 > 面试题库 >

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

郏正信
2023-03-14
问题内容

切成容量小于长度的切片

    包主

    导入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的值。



 类似资料:
  • 问题内容: 考虑下面的go代码: : 我不明白的是,为什么taste_fruits的容量为3,直觉上我希望为2,因为这是切片的长度? 而且,如果tasty_fruits的容量为3,那么为什么: 造成: 问题答案: 这行: 创建一个 数组 ,而不是一个切片。即使您仅提供了3个元素,它也有4个元素。输出: 切片: 结果是: 长度:明显2.容量? 的 容量 是…的片的长度和超过所述切片中的[基本]阵列的

  • 问题内容: 我在4Gb机器的64位linux操作系统中运行以下代码: 当我运行它时,我得到: 如果我更改,我将得到: 当我使用片大小的内存时,我原本希望如此,但是当我尝试使用时,我得到: 因此,显然我无法创建大小为的切片,这使我们想到了一个问题:如果内存不是问题,那么我在Go中无法创建的最大切片是什么? 我记得在Java中,原始数组索引是通过type来管理的,因此,原始数组的最大大小是的最大值,如

  • 如果数据库行的长度达到了大于max java.util.List length的值,并且我尝试获取所有数据,会发生什么?

  • 问题内容: 我正在尝试使用连接服务器,但是PUT方法存在问题。 我需要发送一个包含 1500个字符 (或更多)的字符串,但是在这种情况下,服务器会产生超时并返回 500个服务器内部错误 。 如果我发送的字符串少于 1400个字符 ,则没有问题,服务器返回 OK 。 我的代码如下: // ----------------------- 我尝试添加线 但是服务器的答案还是错误的。 更新: 我可以发现问

  • 问题内容: (正确的代码在“更新5”中) 在此示例C代码中,我尝试将内存范围从0x100000000映射到0x200000000: 在不同的系统(Linux,gcc)上,我得到不同的结果: 结果1: 系统信息(Fedora 14): 结果2: 系统信息(Fedora 12): 我期望“结果2”。也许我的代码有问题。 请帮帮我。 更新1 :如果mmap失败,则打印出errno。 更新3 :将mmap

  • 问题内容: 我已经将我的Elasticsearch集群从1.1升级到1.2,并且在索引一个较大的字符串时出现错误。 索引的映射: 我搜索了文档,但没有找到与最大字段大小有关的任何内容。根据核心类型部分,我不明白为什么要为某个字段“校正分析仪” 。 问题答案: 因此,您遇到了一个术语的最大大小问题。当您将一个字段设置为not_analyzed时,会将其视为一个术语。基本Lucene索引中单个术语的最