使用[] [] int切片越界但是使用map [int] [] int

max*_*low 1 go go-map

为什么这段代码有效

graph := make(map[int][]int, 0)

graph[0] = append(graph[0], 1)
Run Code Online (Sandbox Code Playgroud)

但是,如果你用graph := make([][]int, 0)我得到的第一行替换panic: runtime error: index out of range?这很奇怪.

Fli*_*mzy 6

让我们简化你的代码,让它更明显地发生什么(游乐场链接):

graph1 := make(map[int]int, 0)
graph2 := make([]int, 0)

x := graph1[0] // Success
y := graph2[0] // Panic
Run Code Online (Sandbox Code Playgroud)

从这里我们看到差异是由于map[int]vs []int- 你的类型中的第二个数组实际上是无关紧要的.

现在要了解为什么会发生这种情况,我们需要了解Go如何处理地图和切片访问.从Go Maps in Action中我们了解到:

如果请求的密钥不存在,我们将获得值类型的零值.

在原始的代码,对于切片的零值([]int),是nilappend()治疗nil作为第一个参数为空片.

但是当我们尝试访问空切片的第0个元素时,我们会感到恐慌,因为切片是空的.

总而言之,append您的类型中的第二个切片在您的问题中都是红色鲱鱼.尝试访问切片第一维中不存在的元素时发生混乱.