2017-10-22 2 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

감사합니다. 많은 시간을 절약했습니다. 명성! :) – MKB

0

spotsArr : 사실 내가 뭘해야 같은 형식 뭔가 출력을 얻을 수 있습니다 지도의 배열에 대한 int의지도입니다 - map [int] [] ...

spotsArr  := make(map[int][]map[int64][]int) 
이 라인에

, 당신은 아직 회원이 없습니다 해당 배열의 인덱스에 할당하려고 : 당신은 뭔가 (미세)이 자리 availableSpot.Uid을 설정 말을하는지

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

을하지만 인덱스를 설정 ind 배열에 다른 멤버가없는 멤버 (괜찮은 멤버). 이 문제를 해결하려면 각 행에 대해 적은 작업을 수행하는 것이 좋습니다. 그래야 어디에서 문제가 무엇인지 명확하게 알 수 있습니다. 당신은 문법 오류 해결하기 위해이 작업을 수행 할 수 있습니다 :

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

을하지만 (코드 일을 당신이 통과하고있는의 UID의 인덱스에 대한지도에 인덱스를 설정하려는 이유를 생각할 수 없다 [산업]). 나는 이것을 덜 복잡하고 혼란스럽게 만들려고 노력할 것입니다. 의도를 분명히하기 위해 여러 줄에 그것을 퍼뜨릴 수 있다면 말입니다.

추신 : 사용 된 모든 구조체를 포함하는 코드 샘플을 제공하면 도움이됩니다.

PPS 코드 샘플을 보내 주시면 감사하겠습니다.

+0

응답 주셔서 감사합니다 Kenny, https://play.golang.org/p/Smm0BFgtNp에서 완전한 코드를 공유했습니다. – MKB

+0

그 목적으로'ind'를 사용하고 싶지 않지만 그대로두면됩니다. 비어있는 그것은 "예기치 않은"표현을 기대하고있다 "오류, 지금 당장은 내가 그것을 통과하고 있다고 피하기 위해. 배열이 인덱스 자체를 선택하도록하려면 어떻게해야합니까? – MKB

+0

나는'spotsArr [availableSpot.Uid] [int] = make (map [int64] [int]') 행을'spotsArr [availableSpot.Uid] = []로 바꿨다. map [int64] [] int {make (map [ int64] [] int)}'하지만 여전히 오류가 발생했습니다. – MKB

관련 문제