代码之家  ›  专栏  ›  技术社区  ›  MKB

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

  •  0
  • MKB  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  2
  •   har07    7 年前

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

    ....
    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]]]
    
        2
  •  0
  •   Kenny Grant JimB    7 年前

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

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

    在这一行中,您尝试分配给尚未有成员的数组的索引:

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

    你是说把这个位置设为可用点。Uid设置为something(fine),然后将数组中没有成员的索引ind设置为something(not fine)。为了解决这个问题,我建议尽量减少每一行的操作,这样可以更清楚地了解问题所在和问题所在。您可以这样做来修复语法错误:

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

    但是我想不出为什么要在映射上设置一个索引,指向正在遍历的UID的索引(代码执行[Ind])。如果可以的话,我会尽量减少这一点的复杂性和混乱性,并将其分为几行,以明确目的。

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

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