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

2023-11-24

制作了容量小于长度的切片

package main

import "fmt"

func main() {

    type b []int
    var k = make([]b, 10, 5)
    fmt.Println(k[8])
}

当尝试运行时会出现以下错误。

恐慌:运行时错误:makeslice:上限超出范围

运行时.panic+0x9e /go/src/pkg/runtime/proc.c:1060

运行时.panic(0x453b00, 0x30020390) 运行时.panicstring+0x94 /go/src/pkg/runtime/runtime.c:116

运行时.panicstring(0x4afd6c, 0x40d80c) 运行时.makeslice+0x70 /go/src/pkg/runtime/slice.c:24

运行时.makeslice(0x44302c, 0xa, 0x0, 0x5, 0x0, ...) main.main+0x45 C:/GOEXCE~1/basics/DATATY~1/slice.go:8

main.main() 运行时.mainstart+0xf 386/asm.s:93 运行时.mainstart() 运行时.goexit /go/src/pkg/runtime/proc.c:178

运行时.goexit()

----- 由 ----- 创建的 goroutine

_rt0_386+0xbf 386/asm.s:80

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

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


不,容量不能小于长度。

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

以下不变量始终适用于切片 s (除非您做了不安全的事情):

0 <= len(s) <= cap(s)

您的代码会产生运行时错误而不是编译时错误,因为无法始终静态检测到该错误。在你的情况下可能是这样,但请考虑以下代码:

package main

import (
    "fmt"
    "rand"
)

func main() {
    k := make([]int, rand.Int(), rand.Int())
    fmt.Println(k)
}

传递给 make 的值直到运行时才能知道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么切片长度大于容量会产生运行时错误? 的相关文章

随机推荐

  • 为什么 DateTime.AddHours 似乎不起作用?

    当我这样做时 我得到相同的结果 1338161400 DateTime origin new DateTime 1970 1 1 0 0 0 0 DateTime date DateTime Parse 28 05 12 01 30 Tim
  • ASP.NET OLEDB 代码在 IIS7 上部署时中断

    我正在尝试编写一个简单的网站 ASP NET v4 它将调用 Windows 搜索 查找特定文件并将其返回给用户 我将以下内容作为示例 它调用 remoteserver 上的 Windows Search 服务 并返回 somefile t
  • 如何在 Visual Studio 中获取零引用/未引用代码的列表

    在 Visual Studio 2013 中 特殊代码 方法 属性 字段 的引用数量如下所示代码镜头 我想闲置 零参考 在视觉工作室中编写代码 有什么办法可以得到它们吗 I mean below reference 实现您所追求的目标的最佳
  • 浸入像素转换会产生完全相同的值

    我正在尝试使用以下函数将倾角转换为像素 我尝试过低 中和高密度模拟器 无论我使用哪种模拟器 像素值都与我传递到函数中的倾角值保持相同的值 private int ConvertDips float dips int pixels int T
  • 故事板和自动布局:如何制作圆形图像

    在故事板 xcode 6 中 我想要一个从 Facebook 获取的圆形用户图像配置文件 所以我使用自动布局在故事板中制作了这个界面 然后 使用 Facebook iOS sdk 获取用户个人资料 使用 swift var facebook
  • 错误-->使用 angular4 时找不到管道“过滤器”

    我正在 angular4 node js 部署的项目中进行单元测试 在测试时我发现了这个错误 Template parse errors The pipe filter could not be found tbody tr 所以我将这两个
  • 在c#中检查路径中是否存在文件夹?

    如何检查文件夹名称是否为RM存在于目录中 我已经通过文本框给出了目录路径 例如txtBoxInput Text在这条路上我必须检查 有什么建议吗 Path Combine 和 Directory Exists http msdn micro
  • Xcode - ld:找不到 -lPods 的库

    当我尝试构建 iOS 应用程序时出现这些错误 ld library not found for lPods clang error linker command failed with exit code 1 use v to see in
  • Android studio - flutter:无连接设备

    我刚刚开始使用flutter进行移动开发 在尝试运行默认的flutter程序时出现这个错误 未找到连接的设备 请连接设备 或查看 flutter dev setup 获取入门说明 这是一台 Windows 10 x64 计算机 安装 And
  • 如何在成员函数上使用 std::async?

    如何对成员函数进行 std async 调用 Example class Person public void sum int i cout lt lt i lt lt endl int main int argc char argv Pe
  • 如何在 Python 中迭代 cur.fetchall()

    我正在研究 Python 3 4 中的数据库连接 我的数据库中有两列 下面的查询以显示的格式为我提供了两列中的所有数据 询问 cur execute select from filehash data cur fetchall print
  • 将巨大的(95Mb)JSON 数组分割成更小的块?

    我以 JSON 的形式从数据库中导出了一些数据 它本质上只是一个 列表 其中包含一堆 900K objects 现在尝试将其导入到我的生产服务器上 但我有一些便宜的网络服务器 他们不喜欢我在 10 分钟内吃掉他们所有的资源 如何将该文件分割
  • jquery.tweet.js 插件不起作用,如何显示推文

    我在我的网站上使用了这个插件来显示推文 但即使是插件网站也有问题 http coda co za content projects jquery twitter Code div class columns pre class code j
  • 将元素推入猫鼬数组

    我正在尝试将一个元素推送到猫鼬中的数组中 我正在通过 update 和 push 来完成此操作 但它并没有在数据库中更新它 这是我的代码 路线 js var Chooser require chooser var appRouter fun
  • 非常简单的javascript根本不起作用[重复]

    这个问题在这里已经有答案了 我的 php 静态网站 文件中的 JavaScript 不起作用 我使用了另外 3 个脚本 它们确实有效 但这个不行 情况很简单 JavaScript 是 var myFile document getEleme
  • 如何检查postgres数据库中所有角色/用户/group_role有什么权限?

    我有 postgres 数据库 我想要具有被分配的访问权限的用户列表 我尝试查找查询并查看了 psql 命令行帮助 nu 等 但我没有找到任何有用的信息 有谁知道这件事可以帮助我 Thanks 在此作为对前文的补充 通过以下方式检查用户的权
  • 删除 Pandas DataFrame.to_string 插入的列之间自动的两个空格

    我正在寻找一种解决方案来删除 关闭列之间的 2 个空格df to string自动创建 Example from pandas import DataFrame df DataFrame df df append a 12345 b 123
  • 如何使用keras保存最终模型?

    我使用 KerasClassifier 来训练分类器 代码如下 import numpy from pandas import read csv from keras models import Sequential from keras
  • 从另一个 Servlet 调用 Servlet Post

    我需要从另一个 servlet 调用 servlet POST 方法 并在 servlet 参数中传递一个 blob 这可能吗 如果可以的话该怎么办 PS 我无法使用 Apache HttpClient 您需要自己创建并发送 HTTP 请求
  • 为什么切片长度大于容量会产生运行时错误?

    制作了容量小于长度的切片 package main import fmt func main type b int var k make b 10 5 fmt Println k 8 当尝试运行时会出现以下错误 恐慌 运行时错误 makes