我在过去的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} } }
答案 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感谢代码示例,使其更加清晰。