为何map[int][]int可正常运行,[][]int却触发数组越界panic?
为什么两种写法会有不同的运行结果?
咱们先拆解这两种写法的本质差异,就能明白为什么第二种会触发panic了:
1. 第一种写法:用map存储切片
graph := make(map[int][]int, 0) graph[0] = append(graph[0], 1)
这里你创建的是一个键为int、值为[]int切片的空map。Go语言里有个特性:当你访问map中不存在的键时,会返回对应值类型的零值——这里就是一个空的[]int切片。所以graph[0]一开始会拿到一个空切片,你用append给它添加元素1,再把新切片赋值回graph[0],整个过程完全合法,map会自动把键0加入其中。
2. 第二种写法:用二维切片
graph := make([][]int, 0) graph[0] = append(graph[0], 1)
这里你创建的是一个长度为0的二维切片。和map的逻辑完全不同:切片的索引访问有严格的范围限制——必须在0 <= 索引 < len(切片)之间。现在你的切片长度是0,根本没有graph[0]这个位置,直接访问它就会触发panic: runtime error: index out of range。
如果想让第二种写法正常运行,你需要先给二维切片创建至少一个元素(也就是让长度>=1),比如:
// 创建长度为1的二维切片,每个元素是零值的[]int切片 graph := make([][]int, 1) graph[0] = append(graph[0], 1)
这样graph[0]就指向一个合法的空切片,append操作就能正常执行了。
内容的提问来源于stack exchange,提问作者maxflow
相关产品推荐
相关产品推荐

