go - 使用 [][]int 切片越界,但适用于 map[int][]int
问题描述
为什么这段代码有效
graph := make(map[int][]int, 0)
graph[0] = append(graph[0], 1)
但是如果你用graph := make([][]int, 0)
I get替换第一行panic: runtime error: index out of range
?这很奇怪。
解决方案
让我们简化您的代码,以使正在发生的事情更加明显(游乐场链接):
graph1 := make(map[int]int, 0)
graph2 := make([]int, 0)
x := graph1[0] // Success
y := graph2[0] // Panic
从这里我们看到差异是由于map[int]
vs []int
- 您类型中的第二个数组实际上是无关紧要的。
现在要了解为什么会发生这种情况,我们需要了解 Go 如何处理 map 和 slice 访问。从Go Maps in Action 中,我们了解到:
如果请求的键不存在,我们会得到值类型的零值。
[]int
在您的原始代码中,切片 ( )的零值是nil
,并将第一个参数append()
视为nil
空切片。
但是当我们尝试访问空切片的第 0个元素时,我们会感到恐慌,因为切片是空的。
总之,append
您的类型的第二部分在您的问题中都是红鲱鱼。尝试访问切片第一维中不存在的元素时会发生恐慌。
推荐阅读
- tcp - sk_data_ready 回调无法获取片段数据
- nginx - 使用 Nginx 模块 ngx_http_keyval_module
- php - mysql sum() 不工作。我该如何解决?
- php - 从 php 向 webservice 发送 xml 请求
- google-bigquery - 在命令行中更新 biq 查询中的表数据
- python - Python时间分析每个语句作为参数的函数
- android - 通过意图发送超链接
- python - 没有节点与其子节点具有相同的颜色 - 递归
- scorm - SCORM清单:选择性跟踪/完成?
- javascript - 从 Javascript for Wordpress 调用 PHP 函数