2017-10-22 41 views
1

これは、このコードが実行時に配列インデックスの範囲外のエラーを生成している理由を考え出して、過去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

短くても[playground](https://play.golang.org/)のインデックス外のエラーを示す完全なコードは完璧です。私が作成しようとすると、他にも多くのエラーが発生しました。https://play.golang.org/p/HdkjoU0KXy – har07

+0

@ har07返信いただきありがとうございます。コードを確認してください。私は質問を更新しました。 – MKB

+0

あなたは結果として何をしたいですか? –

答えて

2

エラーメッセージは、スライスの長さよりも大きいインデックスに要素を割り当てようとしたためエラーとなります。離れてエラーを取得するために、あなたはちょうどあなたが使用していた指標限り、少なくとも、長さにスライスを初期化することができます。

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

をしかし、あなたは、所望の出力については、それをさらに明らかなようにあなたが最初の場所でスライスを必要としないようだ。最後の二つのデータが同一の日付を持って考えると

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

次のように、出力は次のとおりです。あなたは、各キーがDateマップの値を有する場合Uidマップが必要:

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

ありがとうhar07、私の時間のトンを保存しました。名誉! :) – MKB

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のインデックスにマップ上のインデックスを設定したい理由を考えることはできません[インディアナ州] )。私は、このことをあまり複雑ではなく、混乱させるようにしようと考えています。

PS実行する(つまり、使用されているすべての構造体を含む)コードサンプルを提供すると、助けがより簡単になります。

PPSコードサンプルをいただきありがとうございます。

+0

レスポンスありがとうKenny、https://play.golang.org/p/Smm0BFgtNpで完全なコードを共有しました。 – MKB

+0

この目的のために 'ind'を使いたくないですが、残しておけば空白それは "予期しない"、表現を期待する "エラー、ちょうど今私がそれを通過していたことを避けるために。どのように配列をインデックス自体を拾うようにこれを達成することができますか? – MKB

+0

私は 'spotsArr [availableSpot.Uid] [ind] = make(map [int64] [int]')の行を 'spotsArr [availableSpot.Uid] = []に置き換えましたmap [int64] [] int {make(map [ int64] [] int)} 'しかし、私はまだエラーに直面しています。 – MKB

関連する問題