为什么这段代码生成的数组索引超出范围?

时间:2017-10-22 05:15:05

标签: arrays go slice

我在过去的5到6个小时内陷入困境,想知道为什么这段代码会在运行时生成数组索引超出范围的错误。我无法找出原因。您能否告诉我们需要哪些修改才能更正此代码?

spotsArr        := make(map[int][]map[int64][]int)
for ind, availableSpot := range availableSpots {
            spotsArr[availableSpot.Uid][ind] = make(map[int64][]int)
            spotsArr[availableSpot.Uid][ind][availableSpot.Date] = []int{availableSpot.SpotSlug}

}
fmt.Println(spotsArr)

修改1 :在此处查看完整代码https://play.golang.org/p/Smm0BFgtNp

编辑2 :实际上,我需要做的是输出格式如下:

{ uid: { date: {spot_slug, spot_slug} } }

{ 86: { 1536710400: {1000, 1200, 900},
      { 1536105600: {900} } }

2 个答案:

答案 0 :(得分:2)

错误是,正如错误消息所示,因为您尝试在索引上分配的元素大于切片长度。为了消除错误,您可以将切片初始化为长度,至少与您想要使用的索引一样多:

....
spotsArr[availableSpot.Uid] = make([]map[int64][]int, ind+1, ind+1)
spotsArr[availableSpot.Uid][ind] = make(map[int64][]int)
....

但是当你进一步澄清所需的输出时,你似乎并不需要切片。您需要 Uid 的地图,其中每个键都具有 Date 地图的值:

spotsArr := make(map[int]map[int64][]int)
for _, availableSpot := range availableSpots {
    if _, ok := spotsArr[availableSpot.Uid]; !ok {
        spotsArr[availableSpot.Uid] = make(map[int64][]int)
    }
    spotsArr[availableSpot.Uid][availableSpot.Date] = append(spotsArr[availableSpot.Uid][availableSpot.Date],availableSpot.SpotSlug)
}
fmt.Println(spotsArr)

<强> playground

鉴于最后两个数据具有相同的日期,输出如下:

map[86:map[1534896000:[900] 1535500800:[900] 1536105600:[900] 1537315200:[900 900]]]

答案 1 :(得分:0)

spotsArr是地图数组的int映射 - map [int] [] ...

spotsArr        := make(map[int][]map[int64][]int)

在这一行上,您尝试分配给那个没有成员的数组的索引:

spotsArr[availableSpot.Uid][ind] = make(map[int64][]int)

你是说把这个地点设置为availableSpot.Uid到某些东西(很好)但是然后将索引ind设置在一个数组中,该数组中没有其他成员(不是很好)。为了解决这个问题,我建议您尝试在每一行上做更少的事情,以便更清楚地解决问题所在。你可以这样做来解决语法错误:

spotsArr[availableSpot.Uid] = []map[int64][]int{make(map[int64][]int)}

但是我无法想到你为什么要在地图上设置一个索引到你正在遍历的UID的索引(你的代码正在执行[Ind])。如果可以的话,我会尝试让它变得不那么复杂和混乱,并将其分散在几行上以使目的明确。

PS为人们提供一个运行的代码示例(即包括所有使用的结构),这样可以更容易地提供帮助。

PPS感谢代码示例,使其更加清晰。