Arrays 为什么这段代码生成数组索引越界?

Arrays 为什么这段代码生成数组索引越界?,arrays,go,slice,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) s

在过去的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:在此处查看完整代码

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

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

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

spotsArr是一个int到映射数组的映射-map[int][

spotsArr        := make(map[int][]map[int64][]int)
在这一行中,您尝试分配给尚未有成员的数组的索引:

spotsArr[availableSpot.Uid][ind] = make(map[int64][]int)
您的意思是将此spot availableSpot.Uid设置为某个值(很好),但将数组中没有成员的索引ind设置为其他值(不好)。为了解决这个问题,我建议尽量减少每一行的操作,以便更清楚地了解问题所在。您可以这样做来修复语法错误:

spotsArr[availableSpot.Uid] = []map[int64][]int{make(map[int64][]int)}
但是我想不出为什么要在映射上设置一个索引,作为正在遍历的UID的索引(代码执行[Ind])。如果可以的话,我会尽量使它不那么复杂和混乱,并将其分散在几行中,以明确目的

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


PPS感谢您提供的代码示例,使其更加清晰。

spotsArr是一个int到map数组的映射-map[int][

spotsArr        := make(map[int][]map[int64][]int)
在这一行中,您尝试分配给尚未有成员的数组的索引:

spotsArr[availableSpot.Uid][ind] = make(map[int64][]int)
您的意思是将此spot availableSpot.Uid设置为某个值(很好),但将数组中没有成员的索引ind设置为其他值(不好)。为了解决这个问题,我建议尽量减少每一行的操作,以便更清楚地了解问题所在。您可以这样做来修复语法错误:

spotsArr[availableSpot.Uid] = []map[int64][]int{make(map[int64][]int)}
但是我想不出为什么要在映射上设置一个索引,作为正在遍历的UID的索引(代码执行[Ind])。如果可以的话,我会尽量使它不那么复杂和混乱,并将其分散在几行中,以明确目的

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


PPS感谢代码示例,这使它更清晰。

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

....
spotsArr[availableSpot.Uid] = make([]map[int64][]int, ind+1, ind+1)
spotsArr[availableSpot.Uid][ind] = make(map[int64][]int)
....
但是,当您进一步澄清所需的输出时,您似乎一开始就不需要切片。您需要
Uid
映射,其中每个键都有
Date
映射值:

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

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

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

....
spotsArr[availableSpot.Uid] = make([]map[int64][]int, ind+1, ind+1)
spotsArr[availableSpot.Uid][ind] = make(map[int64][]int)
....
但是,当您进一步澄清所需的输出时,您似乎一开始就不需要切片。您需要
Uid
映射,其中每个键都有
Date
映射值:

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

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

一个简短但完整的代码演示中的索引越界错误将是完美的。当我尝试创建一个时,出现了许多其他错误:@har07谢谢你的回复,伙计,请检查代码,我已经更新了问题。你能说你希望得到什么结果吗?一个简短但完整的代码演示中的索引越界错误将是完美的。当我尝试创建一个时,出现了许多其他错误:@har07谢谢你的回复,伙计,请检查代码,我已更新了问题。你能说你希望得到什么结果吗?谢谢你的回复Kenny,我已在此处共享了完整的代码:,这可能会有帮助。我也不想为此使用
ind
,但如果我将其留空,则会出现“意外的”,预期表达式“错误,只是暂时避免传递它。我如何才能做到这一点,使数组能够自己获取索引?我将行
spotsArr[availableSpot.Uid][ind]=make(map[int64][]int)
替换为
spotsArr[availableSpot.Uid]=[]map[int64][]int{make(map[int64][]int}
,但我仍然面临错误。感谢Kenny的回复,我在这里分享了完整的代码:,它可能会有帮助。我也不想为此使用
ind
,但如果我将其留空,则会出现“意外的”,预期的表达式“错误,只是暂时避免传递它。我如何才能做到这一点,使数组能够自己获取索引?我将行
spotsArr[availableSpot.Uid][ind]=make(map[int64][]int)
替换为
spotsArr[availableSpot.Uid]=[]map[int64][]int{make(map[int64][]int}
,但我仍然面临着这个错误。非常感谢,你为我节省了大量时间。荣誉!:)谢谢你,你帮我节省了很多时间。荣誉!:)